插入排序

直接插入排序

直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增一的有序表。

整个排序过程为进行n-1趟插入,即:先将序列中的第一个记录看成是一个有序的子序列,然后从第二个记录起逐个进行插入,直至整个序列变成按关键字非递减有序序列为止。

JAVA代码实现:

public static void insertSort(int[] elements){
        for(int i = 1;i <elements.length; i++){
            int j = -1;
            while(j <= i && elements[i] > elements[++j]);//找到element[i]应该摆放的位置,此处可以利用查找算法进行优化
            if(j < i){
                //将j之后的数据移动一位,然后把elements[i]移动到j处
                int temp = elements[i];
                for(int k = i-1;k >= j;k--){
                    elements[k+1] = elements[k];
                }
                elements[j] = temp;
            }
        }
}

说明:直接插入排序的时间复杂度为O(n²),该排序方法是稳定的。


希尔排序(Shell Sort)

希尔排序又称“缩小增量排序”,它也是一种属插入排序类的方法.

它的基本思想是:先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。

这里写图片描述

这里写图片描述

JAVA代码实现:

public static void shellSort(int[] elements){
        for(int h = elements.length/2;h > 0;h /= 2){

            for(int i = h;i < elements.length; i++){
                int j = i % h;
                while(j <= i && elements[i] > elements[j]) j += h;//找到element[i]应该摆放的位置
                if(j < i){
                    //将j之后的数据移动h位,然后把elements[i]移动到j处
                    int temp = elements[i];
                    for(int k = i-h;k >= j;k -= h){
                        elements[k+h] = elements[k];
                    }
                    elements[j] = temp;
                }
            }

        }
}

步骤:
1.以h(h一般取n/2)为间隔将n个元素列分为几个小组,在每个小组内按直接插入法排序
2.令h=h/2,重复第1步
3.当h=1时,排序结束(此时相当于直接插入排序,不过由于数据已经基本排好序,因此比较次数和移动次数比直接插入排序少很多)

说明:希尔排序的时间性能优于直接插入排序;最后一个增量必须为1;希尔排序是不稳定的。希尔排序的分析是一个复杂的问题,因为他的时间是所取“增量”序列的函数,这涉及一些数学上尚未解决的难题。

posted @ 2017-09-06 08:21  Mazhitaoooo  阅读(165)  评论(0编辑  收藏  举报