排序算法之希尔排序

一、简介

基本思想

将待排序的数据元素分成若干个小组,对同一个小组内的数据元素用直接插入法排序;小组的个数逐次减少;当完成了所有数据元素都在一个组内的排序后,排序过程结束。希尔排序又叫缩小增量排序。

二、复杂度情况

复杂度和稳定性情况:

  • 最好的时间复杂度:O(nlog²n)
  • 最坏的时间复杂度:O(nlog²n)
  • 平均的时间复杂度:O(nlogn)
  • 空间复杂度:O(1)
  • 稳定性:不稳定

三、实例说明

以n=8的一个数组 {6, 5, 3, 1, 8, 7, 2, 4} 为例

第一次 gap = 8 / 2 = 4(gap为增量)

  1. 将1A和1B对应的数比较,并排序
  2. 将2A和2B对应的数比较,并排序
  3. 将3A和3B对应的数比较,并排序
  4. 将4A和4B对应的数比较,并排序

6    5    3    1    8    7    2    4

1A                                    1B

          2A                                    2B

                    3A                                   3B

                              4A                                     4B

第一次排序后:6    5    2    1    8    7    3    4

第二次 gap = 4 / 2 = 2(gap为增量)

:默认小的放在左边,假如有交换,还得将目前较大的这个值和左边同组的元素依次比较并排序(直接插入排序的思想)

  1. 将1B和1A对应的数比较,并排序
  2. 将2B和2A对应的数比较,并排序
  3. 将1C和1B对应的数比较,并排序
  4. 将2C和2B对应的数比较,并排序
  5. 将1D和1C对应的数比较,并排序
  6. 将2D和2C对应的数比较,并排序

6    5    2    1    8    7    3    4

1A                1B                 1C                1D

          2A                2B               2C              2D

第二次排序后:2    1    3    4    6    5    8    7

第三次 gap = 2 / 2 = 1(gap为增量)

:默认小的放在左边,假如有交换,还得将目前较大的这个值和左边同组的元素依次比较并排序(直接插入排序的思想)

  1. 将1B和1A对应的数比较,并排序
  2. 将1C和1B对应的数比较,并排序
  3. 将1D和1C对应的数比较,并排序
  4. 将1E和1D对应的数比较,并排序
  5. 将1F和1E对应的数比较,并排序
  6. 将1G和1F对应的数比较,并排序
  7. 将1H和1G对应的数比较,并排序

2    1    3    4    6    5    8    7

1A      1B      1C      1D      1E      1F      1G      1H

第三次排序后:1    2    3    4    5    6    7    8

四、代码实现

C++实现代码如下:

#include<iostream>
using namespace std;

void ShellSort(int a[], int n)
{
	int gap, tmp, j; // gap为增量
    gap = n / 2;
    while (gap != 0)
    {
        for (int i = gap; i < n; ++i)
        {
            tmp = a[i];
            j = i - gap;
            while (tmp < a[j] && j >= 0) // 插入排序法
            {
                a[j+gap] = a[j];
                j -= gap;
            }
            a[j+gap] = tmp;
        }
        gap /= 2;
    }
}

int main()
{
	int arr[] = {6, 5, 3, 1, 8, 7, 2, 4};
	int n = sizeof(arr) / sizeof(arr[0]);
	ShellSort(arr,n);
	for(int i = 0; i < n; ++i)
	{
        cout << arr[i] << " ";
	}
	cout << endl;
	return 0;
}

其他排序算法: 

  1. 堆排
  2. 直接插入排序
  3. 直接选择排序
  4. 快速排序(递归版和非递归版)
  5. 冒泡排序及其优化
  6. 归并排序
  7. 基数排序

ok,今天分享就到这里了。

如果觉得分享对你有所帮助的话,记得点赞哦!

主页还有其他相关文章,欢迎一起学习,一起进步~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值