Java中的基础排序算法(一):直接插入排序、希尔排序

参考文章:https://mp.weixin.qq.com/s/VjqZNPg6dAEReAzqZcb_yw

原文链接:www.jianshu.com/p/5e171281a387

1.直接插入排序 —— 把新的数据插入到已经排好的数据列中。

  1. 将第一个数和第二个数排序,然后构成一个有序序列

  2. 将第三个数插入进去,构成一个新的有序序列。

  3. 对第四个数、第五个数……直到最后一个数,重复第二步。

如何写写成代码:

  1. 首先设定插入次数,即循环次数,for( int i = 1 ; i < length ; i ++),1个数的那次不用插入。

  2. 设定插入数和得到已经排好序列的最后一个数的位数。insertNum 和 j = i - 1。

  3. 从最后一个数开始向前循环,如果插入数小于当前数,就将当前数向后移动一位。

  4. 将当前数放置到空着的位置,即 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.希尔排序 —— 对于直接插入排序问题,数据量巨大时。

  1. 将数的个数设为n,取奇数 k = n / 2,将下标差值为 k 的书分为一组,构成有序序列。

  2. 再取 k = k / 2 ,将下标差值为k的书分为一组,构成有序序列。

  3. 重复第二步,直到 k = 1 执行简单插入排序。

如何写成代码:

  1. 首先确定分的组数。

  2. 然后对组中元素进行插入排序。

  3. 然后将 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;
                }
            }
        }
    }
原文地址:https://www.cnblogs.com/lotuses/p/11640461.html