【C++】学习小笔记系列-2-插入排序和折半插入排序

本文介绍了两种排序算法——插入排序和折半插入排序。插入排序通过不断将无序区的元素插入到已排序部分的适当位置来实现排序;而折半插入排序则采用二分查找的方式确定插入位置,提高效率。

插入排序:
在一组数据中,分为有序区和无序区,有序区初始为该组数据的第一个元素,然后对无序区的第一个元素开始,不断与有序区中的元素比较,移动元素,插入元素,直到无序区中所有元素都放到有序区中。
时间复杂度O(n²) 空间复杂度O(1) 稳定

void InsertSort(RecType R[], int n)
{
     int i, j;
     RecType tmp;
     for(i = 1; i< n; i++){
          tmp = R[i];
          j = i - 1;
          while( j>= 0&&tmp < R[j] ){
               R[j+1] = R[j];
               j--;
          }
          R[j+1] = tmp;
      }
}   

折半插入排序:
在一组数据中,分为有序区和无序区,有序区初始为该数据的第一个元素,从无序区的第一个元素开始,重复找到有序区的中间位置,将无序区的第一个元素与中间位置比较,找到插入的位置后,移动元素,直到无序区中的所有元素都放在有序区中。

void InsertSort(int R[], int n)
{
       int i, j, low, high, mid;
       int tmp;
       for (i = 1; i < n; i++) {
              tmp = R[i];                                   //将R[i]保存到tmp中
              low = 0; high = i - 1;
              while (low <= high) {                         //在R[low..high]中折半查找有序插入的位置
                     mid = (low + high) / 2;                //取中间位置
                     if (tmp < R[mid])
                           high = mid - 1;                  //插入点在左半区
                     else
                           low = mid + 1;                   //插入点在右半区
              }
              for (j = i - 1; j >= high + 1; j--)           //元素后移
                     R[j + 1] = R[j];
              R[high + 1] = tmp;                            //插入元素
       }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值