内排序(四)——谢尔(Shell)排序

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/jiangguangchao/article/details/98755063

核心思想

谢尔(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)

猜你喜欢

转载自blog.csdn.net/jiangguangchao/article/details/98755063