6、非稳定排序三——希尔排序

3、希尔排序
  • 希尔排序就是分组的插入排序,每一轮都会把数组分成不同的组,然后在组内进行插入排序。分组是根据数的距离划分的。比如第一轮距离d=n/2,第二轮d=n/4……,到最后d=1,从而彻底完成排序。

  • 稳定性:由于希尔排序是分组进行的,相等的数可能位于不同的组中,它们的相对位置可能会发生变幻,所以不稳定。

  • 时间复杂度:O(n1.3)~O(n2),空间复杂度:O(1),原地排序

  • 代码:

  #include<iostream>
  #include<vector>
  using namespace std;
  
  void ShellSort(vector<int> &a)
  {
      int d, i, j;// 定义间距d、当前元素i、指向前面序列的指针j
      for ( d = a.size() / 2; d >= 1; d /= 2)// d从n/2开始,每次除以2,直到d=1
          for (int i = d; i < a.size(); i++)// i从第一组的第二个元素开始(因为是插入排序,都是从第二个元素开始)
          {
              if (a[i] < a[i - d])// 如果当前元素小于先前序列的末尾元素
              {
                  int x = a[i];// 记录当前元素
                  j = i - d;// 用指针j指向那个末尾元素
                  a[i] = a[j];// 把那个末尾元素往后移d个单位,也就是移到了i的位置上(注意,此时a[i]被a[j]覆盖了)
                  j -= d;// j再向前移动d个单位,指向一组内倒数第二个元素
                  while (j >= 0 && x < a[j])// 和插入排序一致
                  {
                      a[j + d] = a[j];//后移
                      j -= d;//向前遍历
                  }
                  a[j + d] = x;//j指向的是末尾元素,我们要在末尾元素的后一个位置插入,即在j+d处
              }
          }
  }
  
  int main()
  {
      vector<int> nums = {6,5,3,4,1,2};
      ShellSort(nums);
      for (int i = 0; i < nums.size(); i++)
      {
          cout << nums[i] << " ";
      }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值