排序算法之希尔排序
来源:互联网 发布:青年网络公开课 编辑:程序博客网 时间:2024/05/02 01:58
希尔排序实际上是一种分治思想的插入排序。
插入排序不说了,不清楚看这里http://blog.csdn.net/zfx0906/article/details/6845566
分治思想,对增量为dk,dk递减,开始很多小序列,最后为一个大序列
相对直接插入排序,在希尔排序中,只不过增量不是1,而是dk
较好的增量序列是2^k-1,2^(k-1)-1,.....7,3,1,这样可使Shell排序时间复杂度达到O(N^1.5)(参考《希尔排序最佳增量序列研究》)
while((dlta+1)*2<length)
dlta=(dlta+1)*2-1;//计算出最大增量序列数
。。。
ShellInsert(L,length,dlta);// 算法是直接插入排序,只不过增量不是1,而是dlta
dlta=(dlta+1)/2-1;//增量递减
——————————————代码分界线———————————————————————————
//分治思想+插入排序,//对增量为dk,dk递减,开始很多小序列,最后为一个大序列//插入排序,只不过增量不是1,而是dk//希尔排序实际上是一种分治思想的插入排序#include<stdio.h>#define Length 10#define dLength 3void ShellSort(int*,int);void ShellInsert(int*,int,int);int main(){int L[Length];int dlta[dLength]={5,3,1};int i;printf("请分别输入%d个整数:\n",Length);for(i=0;i<Length;i++){printf("\n请输入第%d个整数:",i+1); scanf("%d",&L[i]);} printf("\n排序前:");for(i=0;i<Length;i++){printf("%5d",L[i]);}ShellSort(L,Length);printf("\n排序后:");for(i=0;i<Length;i++){printf("%5d",L[i]);}printf("\n");getchar();getchar();}//对增量为dk时进行插入排序//算法是直接插入排序,只不过增量不是1,而是dkvoid ShellInsert(int*L,int length,int dlta){int i,j;int temp;for(i=dlta;i<length;i++)if(L[i]<L[i-dlta]){temp=L[i];for(j=i-dlta;j>=0&&L[j]>temp;j-=dlta)L[j+dlta]=L[j];L[j+dlta]=temp;}}//希尔排序算法//时间复杂度约为O(n^1.5),在选择其它增量序列的条件下,可至下限O(nlogn)//希尔排序是一种使用分治法的插入排序void ShellSort(int*L,int length){int i;int dlta = 1;while((dlta+1)*2 <length){ dlta=(dlta+1)*2-1; } while(dlta>0){ShellInsert(L,length,dlta); dlta = (dlta+1)/2-1;}}
- 算法之希尔排序
- 算法之希尔排序
- 算法之希尔排序
- 算法之希尔排序
- 排序算法之希尔排序
- 排序算法之希尔排序
- 排序算法之希尔排序
- 排序算法之希尔排序
- 排序算法之希尔排序
- 排序算法之希尔排序
- 排序算法之希尔排序
- 排序算法之希尔排序
- 排序算法之希尔排序
- 排序算法之希尔排序
- 排序算法之希尔排序
- 排序算法之希尔排序
- 排序算法之希尔排序
- 排序算法之希尔排序
- SWF load SWF 找不到外观
- 泛型编程与设计新思维
- Linux 下使用talk 进行聊天
- android 处理双击事件
- vmware 5 重要资料下载
- 排序算法之希尔排序
- goAhead 2.5嵌入式web服务器移植到arm9 2440 + linux中
- esriFeatureType常量
- 为jar包添加运行命令
- 项目管理实例(1) - 不一样的PMO
- 视频分析资料
- Nginx的 NginxHttpMemcModule的使用
- python thread问题
- 网络编程