希尔排序(shell)
来源:互联网 发布:淘宝转化率0.05算正常 编辑:程序博客网 时间:2024/04/29 00:19
希尔排序(Shell Sort)是插入排序的一种。是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。
原理:希尔排序属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序。(其中增量值即为分区个数。)
以下这种方式较为好理解:--》代码借鉴他人
#include <stdio.h>#include <stdlib.h>//对单个组排序int SortGroup(int* pnData, int nLen, int nBegin,int nStep){ for (int i = nBegin + nStep; i < nLen; i += nStep) { //寻找i元素的位置, for (int j = nBegin; j < i; j+= nStep) { //如果比他小,则这里就是他的位置了 if (pnData[i] < pnData[j]) { int nTemp = pnData[i]; for (int k = i; k > j; k -= nStep) { pnData[k] = pnData[k - nStep]; } pnData[j] = nTemp; } } } return 1;}//希尔排序, pnData要排序的数据, nLen数据的个数int ShellSort(int* pnData, int nLen){ //以nStep分组,nStep每次减为原来的一半。 for (int nStep = nLen / 2; nStep > 0; nStep /= 2) { //对每个组进行排序 for (int i = 0 ;i < nStep; ++i) { SortGroup(pnData, nLen, i, nStep); } } return 1;}int main(){ int nData[10] = {4,10,9,8,7,6,5,4,3,2}; //创建10个数据,测试 ShellSort(nData, 10); //调用希尔排序 for (int i = 0; i < 10; ++i) { printf("%d ", nData[i]); } printf("\n"); system("pause"); return 0;}
void ShellPass(SeqList R,int d) {//希尔排序中的一趟排序,d为当前增量 for(i=d+1;i<=n;i++) //将R[d+1..n]分别插入各组当前的有序区---->此句需要注意 if(R[i].key<R[i-d].key){ R[0]=R[i];j=i-d; //R[0]只是暂存单元,不是哨兵 do {//查找R[i]的插入位置 R[j+d];=R[j]; //后移记录 j=j-d; //查找前一记录 }while(j>0&&R[0].key<R[j].key); R[j+d]=R[0]; //插入R[i]到正确的位置上 } //endif } //ShellPass void ShellSort(SeqList R) { int increment=n; //增量初值,不妨设n>0 do { increment=increment/3+1; //求下一增量 ShellPass(R,increment); //一趟增量为increment的Shell插入排序 }while(increment>1) } //ShellSort
时间复杂度:介意 O(nlgn)~O(n2)
稳定性:不稳定 ----》主要是大跨度个人理解 分,治(类似)
- 希尔(Shell)排序
- 希尔(shell)排序
- 希尔(shell)排序
- 希尔排序(shell)
- 希尔(shell)排序
- 希尔排序(shell)
- 希尔(Shell)排序
- 希尔(shell)排序
- Shell排序(希尔排序)
- Shell排序(希尔排序)
- shell排序(希尔排序)
- 希尔排序(Shell Sort)
- 希尔排序(Shell Sort)
- 希尔排序(shell sort)
- 希尔排序(Shell Sort)
- 希尔排序(Shell Sort)
- 希尔排序(Shell Sort)
- 希尔排序(Shell Sort)
- 基本的tcp套接口编程
- 我想当一个有用黑客求高手带
- 读书笔记之《Windows内核原理与实现》
- 根据分段函数的算式求出y的值
- 使用串口助手乱码的可能问题之一
- 希尔排序(shell)
- 求平方根sqrt()函数的底层算法效率问题(转载)
- 数据完整性约束:主键、外键、各种约束的创建删除语句
- 关于Google protobuf的总结
- 一键更新盘古权限系统
- 微信开发之如何根据经纬度获取所在的地点信息
- 【PAT】1017. Queueing at Bank (25)
- springMVC 教程 快速入门 深入分析
- C#基础知识(六)