算法--希尔排序

本文详细介绍了希尔排序的概念、思想、增量选择方法及代码实现,并探讨了其效率和应用场景,强调了混合效应在排序过程中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

希尔排序

定义

     建立在少量增量的基础上、是针对直接插入排序算法的改进

思想:

      先对原始数组各部分进行排序,待数组中元素基本有序,再对数组进行一次排序。若子数组已经排好序,此时的数组相对初始数组已经非常接近一个有序数组的最好情况了。它主要是建立在少量的增量上面的。若增量为5,则对在0,5,10位置上的元素,1,6上的元素,2,7上的元素进行排序,然后增量减少。比如减少至3,则对上次排序好的数组的0,3,6,9进行排序,对1,4,7上的元素进行排序,以此类推。

      其中增量的选择是最为重要的。我们应该采用的是混合效应。而且最后一个增量必须为1,才能保证数组是有序的。若增量为2,则掉到交换的次数会快速地减少。通常采用的增量序列如下:

hi=1

hi+1=3*h+1

运行结果:


效率:

     在分组中采用的是插入排序,其效能大于插入。不是稳定的排序。因为增量的原因。不需要大量的辅助空间。

代码:

template<class T>//进行希尔排序
void ShellSort<T>::Shell_Sort(T *ShellSortArray,int length)
{
//主要思想:1、进行增量的设置,尽管没有令人信服的增量设置,但是我们要防止4-,2-这样的增量,如此混合效应丢失
//2、对分组的数据进行插入排序
//3、一直到增量为1-


//插入排序的要点,是比较前面的元素,若比比较的元素大,则前面的元素赋值给后面的元素
//一直到不大于比比较元素时,将比较元素插入


int increaseNumIndex=0;//增量的索引
int h=1;//增量
int increase[20];//增量数组
int k=0;
while(h<length)
{
increase[increaseNumIndex]=h;
h=h*3+1;//设置增量的值
increaseNumIndex++;
}
increaseNumIndex--;
while(increaseNumIndex>=0)
{
h=increase[increaseNumIndex];//获得增量
for(int i=0;i<h;i++)
{
for (int j=i;j<length;j+=h)
{
k=j;
T temp=*(ShellSortArray+k);//后面采用插入排序
while((k-h)>=0&&temp<*(ShellSortArray+(k-h)))
{
*(ShellSortArray+k)=*(ShellSortArray+(k-h));
k=k-h;
}
*(ShellSortArray+k)=temp;
}
}
cout<<"增量为:"<<h<<endl;
for (int i=0;i<10;i++)
{
cout<<*(ShellSortArray+i)<<" ";
}
cout<<endl;
increaseNumIndex--;//继续更小的增量
}
}


小结:1、主要比较的对象,是当前的数组中对应的元素

2、采用插入排序,若是索引上元素比要比较的元素大,则index-增量h。


### 希尔排序算法详解 #### 算法概述 希尔排序(Shell Sort),亦称为递减增量排序算法,是对插入排序的一种优化版本[^1]。该算法由Donald Shell于1959年提出,并在论文“A high-speed sorting procedure”中对其进行了详细的阐述[^3]。 #### 工作原理 希尔排序通过比较相隔一定间隔的元素来工作,这些间隔逐渐减少直到变为1。当间隔为1时,希尔排序即成为普通的插入排序。这种策略使得远距离的数据可以更快地移动到接近其最终位置的地方,从而提高了整体性能[^4]。 #### 时间复杂度分析 尽管具体的渐近时间复杂度取决于所使用的间隔序列,但在最坏情况下,希尔排序的时间复杂度通常优于简单的插入排序。对于某些特定的选择间隔序列,平均情况下的表现甚至能够达到接近\( O(n \log n) \)。 #### 实现细节 以下是使用Python编写的希尔排序的具体实现: ```python def shell_sort(arr): n = len(arr) gap = n // 2 while gap > 0: for i in range(gap, n): temp = arr[i] j = i while j >= gap and arr[j - gap] > temp: arr[j] = arr[j - gap] j -= gap arr[j] = temp gap //= 2 if __name__ == "__main__": test_array = [64, 34, 25, 12, 22, 11, 90] print("原始数组:", test_array) shell_sort(test_array) print("排序后的数组:", test_array) ``` 这段代码展示了如何利用逐步缩小的间隔来进行多次部分有序化的操作,最后完成整个列表的完全排序过程[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值