希尔排序

来源:互联网 发布:tensorflow支持显卡 编辑:程序博客网 时间:2024/05/22 07:40

排序算法之希尔排序(ShellSort)

希尔排序是插入排序的升级,又称为递减增量排序算法,不稳定的排序算法

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

  • 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
  • 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位


以23, 10, 4, 1的步长序列进行希尔排序。

最坏时间复杂度根据步长序列的不同而不同。已知最好的:{\displaystyle O(n\log ^{2}n)}O(n\log^2 n)最优时间复杂度O(n)平均时间复杂度根据步长序列的不同而不同。空间复杂度

#include<stdio.h>#include<stdlib.h>//定步长//各组内插入排序void ShellSort(int a[],int nlen){int i,j,k,temp;int nGap;if(a==NULL ||nlen <=0) return ;//定步长for(nGap=nlen/2;nGap>=1;nGap/=2){for(i=0;i<nGap;i++){for(j=i+nGap;j<nlen;j+=nGap){k=j-nGap;temp=a[j];while (a[k] > temp && k>=0){a[k+nGap]=a[k];k-=nGap;}a[k+nGap]=temp;}}}}//-------------代码优化void ShellSort2(int a[],int nlen){int i,k,temp;int nGap;if(a==NULL || nlen <= 0) return ;//定步长for(nGap=nlen/2;nGap>=1;nGap/=2){for(i=nGap;i<nlen;i++){//插入排序k=i-nGap;  //有序数组最后一个temp=a[i]; //无序数组最后一个while (a[k]>temp && k>=0){a[k+nGap] = a[k]; //有序数组后移k-=nGap;  //向前遍历}a[k+nGap]=temp;}}}int main(){int a[]={2,1,3,4,5,11,7,0,9};int n = sizeof(a)/sizeof(a[0]);int i=0;ShellSort2(a,n);for(i=0;i<n;i++){printf("%d ",a[i]);}printf("\n");system("pause");return 0;}


原创粉丝点击