Java八大排序之插入排序
Posted mtgh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java八大排序之插入排序相关的知识,希望对你有一定的参考价值。
插入排序
也可叫直接插入排序,该算法的思路是:初始可认为文件中的第1个记录已排好序,然后将第2个到第n个记录依次插入到已排序的记录组成的文件中。
步骤:
假设有一组数组为(数组下标0—n-1):
arrays=49,38,65,97,176,213,227,49,78,34,12,164,11,18,1;
一,从下标为1的数据(当前数据)开始遍历,而且之后往后移直到下标为n-1(数组的最后一位下标数据);
二,定义一个变量并保存当前数据;
三,当前数据与前面数据依次对比直到前面数据的下标为0,如果大于当前数据,则把前面的数据往右移一位;
四,每执行第三步后,将之前保存当前数据的变量赋值为给前面数据的下标加1.
流程图:
代码:
1 public class TestInsert 2 //直接插入排序 3 public static void insertSort(int[] arrays) 4 int i,j; 5 //从第二位开始遍历,(之后把第i位数据叫作当前数据) 6 for (i = 1; i <arrays.length; i++) 7 //保存当前数据为temp 8 int temp = arrays[i]; 9 j = i - 1; //把 j 赋值为 i 的前一个数据 10 //循环,如果j大于等于0 且 第j个数据大于当前数据 11 while (j >= 0 && arrays[j] > temp) 12 arrays[j+1] = arrays[j]; //第j个数据往右移一位 13 j = j - 1; //往前一位一位移动 14 15 //把当前数据赋给arrays[j+1],因为在while循环内最后总会j-1 16 arrays[j+1] = temp; 17 System.out.println("第"+i+"次:"+Arrays.toString(arrays)); 18 19 System.out.println("最后结果:"+Arrays.toString(arrays)); 20 21 22 public static void main(String[] args) 23 int[] arrays=49,38,65,97,176,213,227,49,78,34,12,164,11,18,1; 24 insertSort(arrays); 25 26
测试结果:
第1次:[38, 49, 65, 97, 176, 213, 227, 49, 78, 34, 12, 164, 11, 18, 1] 第2次:[38, 49, 65, 97, 176, 213, 227, 49, 78, 34, 12, 164, 11, 18, 1] 第3次:[38, 49, 65, 97, 176, 213, 227, 49, 78, 34, 12, 164, 11, 18, 1] 第4次:[38, 49, 65, 97, 176, 213, 227, 49, 78, 34, 12, 164, 11, 18, 1] 第5次:[38, 49, 65, 97, 176, 213, 227, 49, 78, 34, 12, 164, 11, 18, 1] 第6次:[38, 49, 65, 97, 176, 213, 227, 49, 78, 34, 12, 164, 11, 18, 1] 第7次:[38, 49, 49, 65, 97, 176, 213, 227, 78, 34, 12, 164, 11, 18, 1] 第8次:[38, 49, 49, 65, 78, 97, 176, 213, 227, 34, 12, 164, 11, 18, 1] 第9次:[34, 38, 49, 49, 65, 78, 97, 176, 213, 227, 12, 164, 11, 18, 1] 第10次:[12, 34, 38, 49, 49, 65, 78, 97, 176, 213, 227, 164, 11, 18, 1] 第11次:[12, 34, 38, 49, 49, 65, 78, 97, 164, 176, 213, 227, 11, 18, 1] 第12次:[11, 12, 34, 38, 49, 49, 65, 78, 97, 164, 176, 213, 227, 18, 1] 第13次:[11, 12, 18, 34, 38, 49, 49, 65, 78, 97, 164, 176, 213, 227, 1] 第14次:[1, 11, 12, 18, 34, 38, 49, 49, 65, 78, 97, 164, 176, 213, 227] 最后结果:[1, 11, 12, 18, 34, 38, 49, 49, 65, 78, 97, 164, 176, 213, 227]
时间复杂度:因为外层循环为n-1,所以在最好的情况下,序列本身就是有序的,那么时间复杂度为O(n);最坏的情况下循环次数为n*(n-1)/2,那么时间复杂度为O(n2)。
空间复杂度:插入排序算法,只需要两个变量暂存当前数,以及下标,与n的大小无关,所以空间复杂度为:O(1)。
结语:
语言表达能力不好,所以只能这样了,还有就是应该还有这个算法的优缺点没有写,明着说,我还不知道。
以上是关于Java八大排序之插入排序的主要内容,如果未能解决你的问题,请参考以下文章