码迷,mamicode.com
首页 > 编程语言 > 详细

排序之插入排序:直接插入和希尔排序

时间:2018-03-25 18:10:39      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:插入   sort   while   直接插入   初始   原理   希尔排序   思想   temp   

一、插入排序

1、思想:原理类似抓扑克牌,在有序表中进行插入和查找,插入合适的位置时,之后的元素需要往后移动

2、时间复杂度:

最好:O(N),正序情况,只有比较时间,无移动时间

最坏:O(N2),逆序情况

平均:O(N2)

3、辅助空间:O(1)

4、稳定性:稳定

5、适用场合:适用于初始序列基本有序的情况,或者n小的时候,插入排序效率高

 1     public static void insertSort(int[] a) {
 2         int target,i,j;
 3         for(j = 1;j<a.length;j++) {//当前带插入的元素下标
 4             target = a[j];
 5             while(j>0&&target < a[j-1]) {
 6                 a[j] = a[j-1];//向后移动
 7                 j--;
 8             }
 9             a[j] = target;
10         }
11     }
12         

二、希尔排序

1、思想:先将整个待排记录序列分割成若干子序列分别进行直接插入排序,待整个记录基本有序时,再对整个记录进行一趟插入排序,步长最后必减少为1

2、时间复杂度:

最好:O(N1.3)

最坏:O(N2)

平均:根据步长不同

3、辅助空间:O(1)

4、稳定性:不稳定,插入排序本身稳定,但是由于有步长,所以不稳定

5、适用场合:关键字较小的记录就不是一步一步地向前挪动,而是跳跃式地往前移,从而使得进行最后一趟排序时,整个序列已经做到基本有序,只要作记录的少量比较和移动即可。因此希尔排序的效率要比直接插入排序高。

public static void shellSort(int[] a) {
        int i,j,r,temp;
        for(r = a.length/2;r >= 1;r = r/2) { //r为步长
            for(i = r;i < a.length;i++) {
                temp = a[i];
                j = i - r;
                while(j >= 0 && temp < a[j]) {
                    a[j+r] = a[j];
                    j-= r;
                }
                a[j+r] = temp;
            }
        }
    }

 

排序之插入排序:直接插入和希尔排序

标签:插入   sort   while   直接插入   初始   原理   希尔排序   思想   temp   

原文地址:https://www.cnblogs.com/lizijiangmm/p/8645423.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!