数据结构——插入排序

插入排序

排序原理

这是一种简单的插入排序法,基本思想是:把待排序的记录按其关键码值的大小逐个插入到一 个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

直接插入排序

在一个排序数组中,将第一个元素看作排序序列中的唯一元素,申请一个空间存放将要插入的元素,然后将要插入的元素与这个元素比较,根据排序条件确定要插入元素插入的位置,有序序列元素加一,申请空间里放下一个要插入的元素,再次和有序序列中的元素比较(从后往前),确定要插入的位置,比其大的元素依次往后移动一位。

代码实现
void insertSort2(int a[],int size){
     if(size==0) return;
     for(int i=1;i<size;i++){
         int k=a[i];
         int end=i-1;
        while(a[end]>k&&end>=0){
          a[end+1]=a[end];
          end--;
        }
         a[end+1]=k;
     }
}
        
直接插入排序的特性总结:
  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1),它是一种稳定的排序算法
  4. 稳定性:稳定

稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 序算法是稳定的;否则称为不稳定的。

折半插入排序

在插入数据过程中,比较次数可能会比较多,我们可以将直接查找的方改为折半查找,即可得到折半插入排序算法,相比于直接插入排序,有一定的优化。

void insertSort2(int a[],int size){
     if(size==0) return;
     for(int i=1;i<size;i++){
         int k=a[i];
         int left=0;
         int right=i-1
         int end=i-1;
         while(left<=right){
           int mid=left+(right-left)>>1;
            if(a[mid]>k)
              right=mid-1;
            else
              left=mid+1;
         }
         while(left<=end){
           a[end+1]=a[end];
           end--;
         }
         a[end+1]=k;
     }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值