排序算法 四.希尔排序

希尔排序

a

希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

b

平均时间复杂度:O(nlogn)

c

实现:
1.把数组按照一定增量划分成若干个子序列(增量从数组长度/2开始,每次除以2递减直到1)
2.对每次划分的子序列都进行插入排序,直到最后增量为1,希尔排序就完成了

d

C语言

#include<stdio.h>
void ShellSort(int R[],int n){ /*希尔排序算法*/
     int i,j,d;
     int temp;
     d=n/2;     /*d取初值n/2*/
     while (d>0){
         for (i=d;i<n;i++){ /*将R[d..n-1]分别插入各组当前有序区*/
             j=i-d;
          while (j>=0 && R[j]>R[j+d]){ 
              temp=R[j];           /*R[j]与R[j+d]交换*/
              R[j]=R[j+d];
              R[j+d]=temp;
              j=j-d;
    }
         }
         d=d/2;                   /*递减增量d*/
     }
}
void main(){
    int n[10];
    printf("请输入10个数,以逗号隔开:");
    scanf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",&n[0],&n[1],&n[2],&n[3],&n[4],&n[5],&n[6],&n[7],&n[8],&n[9]);
    ShellSort(n,10);
    for(int i=0;i<=9;i++){
        printf("%d ",n[i]);
    }
    printf("\n");
}

运行
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44793599/article/details/89259255