希尔排序是直接插入排序的一种,一般直接插入排序适用于基本有序的排序表和数据量不大的排序表。
希尔排序的原理是,先将待排序表分割成若干个步长为dk的子表,举个例子
下面的无序排列
8 0 4 1 5 3 7 6 2 9
初始的时候dk设置为数组长度的一半也就是5,那么第一次排序后可以达到这样的效果,处于第1个位置的元素比第1+5个位置的元素小,第1+5个元素的位置比第1+10个元素的位置小;处于第2个位置的元素比第2+5个位置的元素小,第2+10个元素的位置比第2+8个元素的位置小(当然到后面长度不够了)
第一趟排序之后,dk设置为5的一半也就是2,第二趟排序之后还要达到上面类似的效果。
当dk的值变为1时,这时候元素已经基本有序了,相当于进行一次直接插入排序
具体代码如下。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[10010];
int n;
cin>>n;
for(int i=1; i<=n; ++i)
{
cin>>a[i];
}
int j;
for(int dk=n/2; dk>=1; dk/=2)
{
for(int i=dk+1; i<=n; ++i)
{
if(a[i]<a[i-dk])
{
int t=a[i];
for(j=i-dk; j>0&&t<a[j]; j-=dk)
a[j+dk]=a[j];
a[j+dk]=t;
}
}
}
for(int i=1; i<n; ++i)
{
cout<<a[i]<<" ";
}
cout<<a[n];
}
本文深入解析希尔排序算法,一种改进的直接插入排序方法。通过逐步减小增量,将数组分割成多个子表进行部分排序,最终实现高效排序。文章详细介绍了希尔排序的原理、步骤及其实现代码。
603

被折叠的 条评论
为什么被折叠?



