版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
核心思想
谢尔(Shell)排序,也叫缩小增量排序法,其核心思想如下:
首先确定一个元素的间隔数gap。
将参加排序的元素按照gap分隔成若干个子序列( 即分别把那些位置相隔为gap的元素看作一个子序列),然后对各个子序列采用某一种排序方法进行排序;此后减小gap值,重复上述过程,直到gap<1。
常用的一种减小gap的方法如下:
基于上述减小gap的方法,谢尔排序法的完整过程图解如下:
gap为4时,初始数据分为4个序列,49、76、35;97、65;38、13;50、27;分别对这个4个序列内进行排序得到第一趟排序,然后gap除以2,得到新的序列…
算法实现
谢尔排序的C语言实现如下,其中子序列内采用冒泡排序方法:
void SHELLSORT(keytype K[ ],int n)
{
int i, j, flag, gap=n;
keytype temp;
while(gap>1){
gap=gap/2;
do{
flag=0; // 每趟排序前,标志flag置0 */
for(i=1;i<=n–gap;i++){
j=i+gap;
if(K[i]>K[j]){
temp=K[i];
K[i]=K[j];
K[j]=temp;
flag=1;
}
}
}while(flag!=0);
}
}
算法分析
谢尔排序算法的时间复杂度和gap分割方法有关,经过大量实验测试,其时间复杂度在O(nlog2n)与O(n2)之间,小于O(n3/2)