排序算法小结之插入排序

排序算法的稳定性:在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序这些记录的相对次序保持不变,即在原序列中ri = rj,且ri在rj前,而排序后的序列中ri任然在rj之前,则称这种排序算法是稳定的。

常用排序算法的时间复杂度:
http://blog.csdn.net/sysukehan/article/details/52661295
计数排序中n指的是关键字的个数,k指的是最大关键字与最小关键字的差值。
基数排序中r代表关键字的基数,d代表最大数据的长度,n代表关键字的个数。
*希尔排序的平均时间复杂度取决于增量的选取
**桶排序的最差时间复杂度取决于桶中的排序算法
*桶排序的稳定性取决于桶中的排序算法

插入排序
基本思想是在一个已经排好序的记录子集的基础上,每一步将下一个待排序的记录有序插入到已排好序的记录子集中,直到将所有的待排序的记录全部插入为止。类似于打扑克牌时候的抓牌,每抓取一张牌就将其插入到合适的位置,直到抓完为止。

插入排序–直接插入排序
直接插入排序的思想是将第i个记录插入到前面i-1个已经排好序的记录中,通过从后往前的比较,将比待排大的记录后移一位,直到找到小于等于待排记录的记录,将待排记录插入该记录的后面。
给出代码如下:

 void InsSort(RecordType r[], int length){
        int temp = 0;
        int j = 0;
        for(i = 1;i<length;i++){
            temp = r[i];
            j = i -1;
            while(temp < r[j] &&  j >= 0){
                r[j + 1] = r[j];
                j--;
            }
            r[j+1] = temp;
        }
}

算法分析:在算法中只使用了一个辅助空间来作为“岗哨”,即算法的空间复杂度是O(1)。从时间复杂度上,最好情况即序列为顺序,此时比较执行一次,没有数据移动,整体执行的次数为(n-1)次,时间复杂度为O(n); 最坏情况即序列为逆序,对于每一个待插入的记录,while循环中关键字的比较次数和移动次数为i-1次,整体为(n-1)*n/2次,即时间复杂度为O(n^2)。

插入排序–折半插入
根据二分查找的思想,每次在寻找插入位置时使用折半查找,可以大大减少比较次数。根据二分查找思想实现的插入排序即折半插入也叫二分插入。
代码:

void BinSort(RecordType r[] , int length){
        int temp = 0;
        int i = 0, j = 0;
        for(i = 1; i<length; i++){
            int low = 0;
            int high = i - 1;
            temp = r[i];
            while(low <= high){   //确定插入位置
                mid = (low + high)/2;
                if(r[mid] > temp) high = mid-1;
                else low = mid +1;
            }
            for(j = i -1; j >= low; --j){ //记录依次向后移动
                r[j+1] = r[j];
            }
            r[low] = temp;  //插入记录
        }
 }

插入排序–希尔排序
算法改进要点:直接插入排序法在待排序列的关键字序列基本有序且关键字个数n较少的情况下,其算法性能最佳。希尔排序又称为缩小增量排序法,是一种基于插入思想的排序方法,利用了直接插入排序的最佳性质。
算法思想:先将待排序列分割成若干个“较为稀疏”的子序列,分别进行直接插入排序。经过调整使序列基本有序,最后再对全部记录进行一次直接插入排序。

例如,假设有这样一组数[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],如果我们以步长为5开始进行排序,我们可以通过将这列表放在有5列的表中来更好地描述算法,这样他们就应该看起来是这样:
13 14 94 33 82
25 59 94 65 23
45 27 73 25 39
10
然后我们对每列进行排序:
10 14 73 25 23
13 27 94 33 39
25 59 94 65 82
45
将上述四行数字,依序接在一起时我们得到:[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ].这时10已经移至正确位置了,然后再以3为步长进行排序:
10 14 73
25 23 13
27 94 33
39 25 59
94 65 82
45
排序之后变为:
10 14 13
25 23 33
27 25 59
39 65 73
45 94 82
94
最后以1步长进行排序(此时就是简单的插入排序了)。

以上就是希尔排序的基本思想。
希尔排序的步长d一般选择是d=n/2; d = d/2; …直到d等于1。
希尔排序是插入排序思想中唯一不稳定的排序思想。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值