插入排序

一. 直接插入排序

时间复杂度为O(n^2) 元素移动是顺序的 所以为稳定排序

在一个数组中,将第一个元素看作排序元素序列里的唯一元素,然后申请一个空间出来,首先存放第二元素,即可在数组中空第二个元素位置(即此位置可被覆盖),将第二个元素与有序序列里面唯一一个元素进行比较,根据排序条件决定元素交换与否,然后有序序列元素加一,申请空间里面存放将要插进有序序列里面的元素;

具体代码如下:

void insertsort(int *array,int n)
{
     int j = 0,i = 0;
     for(i = 1;i < n;i++)
     {
         int temp = array[i];
         for( j = i-1 ; j >= 0 ; j--)
         {
             if(temp < array[j])
             {
                 array[j+1] = array[j];
             }else{
                  break;
             }
         }
         array[j+1] = temp; 
      }
}

二 折半插入排序

时间复杂度 O(N^2) 稳定排序

在直接插入排序的基础上加上折半查找思想

代码如下:

void binaryinsertsort(int *array,int n)
{
    int i = 1,j = 0,left = 0,right = 0;
    for(i = 1; i < n;++i)
    {
         int temp = array[i];
         j = i - 1;
         left = 0;
         right = j; 
         //while 找到元素要插入的位置
         while(left < right)
         {
             //middle = (left + right)/2 防止越界
             middle = left + (right-left)/2;
             if(array[middle] <= temp)
             {
                  left = middle + 1;
             }else{
                  right = middle - 1;
             }
         }

         //将要插入元素位置数据依次往后移
         for(j = i - 1;j >= left;j--)
         {
              array[j + 1] = array[j];     
         }
         //存入数据
         array[left] = temp;
    }
 }

三. 希尔排序

时间复杂度O(N^1.3) 介于O(N^2)与O(N(log 2 N))之间 (元素跳着移动)不稳定排序

希尔排序是将数据元素根据不同间隔分为多个交叉又各自独立进行插入排序的子序列,每趟结束数据的有序性提高

代码如下:

void  shellsort(int *array,int n)
{
     int i = 0, j = 0,temp = 0;
     int gap = n/2;
     while(gap > 0)
     {
          //j为待排序的元素位置 插入元素gap~(n-1)
         for(i = gap ;i < n; ++i)
          {
               temp = array[i];            
               //直接插入排序的部分
               for(j = i - gap;j >= 0;j -= gap)
               {
                   if(temp < array[j])
                   {
                       array[j+gap] = array[j] ;
                   }else{
                       break;
                   }
               }
                array[j + gap] = temp;      
         }
         gap = gap/2;
     }
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值