参考文章:https://mp.weixin.qq.com/s/VjqZNPg6dAEReAzqZcb_yw
原文链接:www.jianshu.com/p/5e171281a387
1.直接插入排序 —— 把新的数据插入到已经排好的数据列中。
-
将第一个数和第二个数排序,然后构成一个有序序列
-
将第三个数插入进去,构成一个新的有序序列。
-
对第四个数、第五个数……直到最后一个数,重复第二步。
如何写写成代码:
-
首先设定插入次数,即循环次数,for( int i = 1 ; i < length ; i ++),1个数的那次不用插入。
-
设定插入数和得到已经排好序列的最后一个数的位数。insertNum 和 j = i - 1。
-
从最后一个数开始向前循环,如果插入数小于当前数,就将当前数向后移动一位。
-
将当前数放置到空着的位置,即 j + 1。
public void insertSort(int[] a){ int length=a.length;//数组长度,将这个提取出来是为了提高速度。 int insertNum;//要插入的数 for(int i=1;i<length;i++){//插入的次数 insertNum=a[i];//要插入的数 int j=i-1;//已经排序好的序列元素个数 while(j>=0&&a[j]>insertNum){//序列从后到前循环,将大于insertNum的数向后移动一格 a[j+1]=a[j];//元素移动一格 j--; } a[j+1]=insertNum;//将需要插入的数放在要插入的位置。 } }
2.希尔排序 —— 对于直接插入排序问题,数据量巨大时。
-
将数的个数设为n,取奇数 k = n / 2,将下标差值为 k 的书分为一组,构成有序序列。
-
再取 k = k / 2 ,将下标差值为k的书分为一组,构成有序序列。
-
重复第二步,直到 k = 1 执行简单插入排序。
如何写成代码:
-
首先确定分的组数。
-
然后对组中元素进行插入排序。
-
然后将 length / 2,重复1,2步,直到 length = 0 为止。
public void sheelSort(int[] a){ int d = a.length; while (d!=0) { d=d/2; for (int x = 0; x < d; x++) {//分的组数 for (int i = x + d; i < a.length; i += d) {//组中的元素,从第二个数开始 int j = i - d;//j为有序序列最后一位的位数 int temp = a[i];//要插入的元素 for (; j >= 0 && temp < a[j]; j -= d) {//从后往前遍历。 a[j + d] = a[j];//向后移动d位 } a[j + d] = temp; } } } }