希尔排序
来源:互联网 发布:淘宝上的护肤品能买吗 编辑:程序博客网 时间:2024/06/05 04:38
基本思想:将需要排序的序列划分为若干个较小的序列,对这些序列进行直接插入排序,通过这样的操作可使需要排序的数列基本有序,最后再使用一次直接插入排序对整个数列进行排序。
划分子序列:取上一个增量的一半作为此次子序列划分的增量,一般初始值取元素的总数量。
有8个元素
数组:69 65 90 1 50 30 70 9
下标:0 1 2 3 4 5 6 7
1.设置增量为8/2=4,从下标为4的元素开始,一直和与它相差4的下标元素相比,即50和69比较,30和65比较,70和90比较,9和1比较
排序结果为:50 30 70 1 69 65 90 9
0 1 2 3 4 5 6 7
2.设置增量为4/2=2,从下标为2的元素开始开始比
(1)下标为2的70和50相比,大于50不交换,下标加1为3
(2)下标为3的1和30相比,小于交换位置,下标加1继续向后比
数组为:50 1 70 30 69 65 90 9
0 1 2 3 4 5 6 7
(3)下标为4的 69先和70比,小于70交换位置,然后69再和与70下标相差2的元素相比,69和50比,大于它不交换位置,下标加1
数组为:50 1 69 30 70 65 90 9
0 1 2 3 4 5 6 7
(4)下标为5的65先和与它下标相差2的30比,大于它不交换,下标加1
(5)下标为6的90和70相比,大于它,下标加1
(6)下标为7的9先和65比,小于65,65放在下标为7的位置,然后9再和下标为3的30相比,小于30,将30放在下标为5的位置,9和下标为1的1相比,大于1,将9放在下标为3的位置,继续下一个元素
数组为:50 1 69 9 70 30 90 65
0 1 2 3 4 5 6 7
3.设置增量为2/2=1
(1)1和50相比,小于50交换位置,1 50 69 9 70 30 90 65
(2)69先和50比,大于50,不交换
(3)9和它前面的元素从69开始依次向前比,直到找到小于9的元素1,将9插入1前面,数组为1 9 50 69 70 30 90 65
(4)70和69比,大于69不交换
(5)30和它前面的元素依次相比找到第一个小于30的元素9,将30插入9的后面,数组为1 9 30 50 69 70 90 65
(6)90和70比,大于不交换
(7)65和它前面每一个元素比较,直到找到小于65的元素50,将65插入,1 9 30 50 65 69 70 90
希尔排序算法时间复杂度:O(nlogn)
#include <iostream>using namespace std;//希尔排序void ShellSort(int * data,int length){if(data==NULL||length<=0)return;int d,i,j,temp;d=length/2;while(d>=1){for(i=d;i<length;i++){temp=data[i];j=i-d;//i之前第一个与i相差增量d的元素的下标while(j>=0&&data[j]>temp)//如果data[j]大于当前元素{data[j+d]=data[j];//将data[j]向后移动j=j-d;//继续向前找与j相差d的元素的下标}data[j+d]=temp;}d=d/2;//缩小增量}}int main(){int data[]={69,65,90,1,50,30,70,9};ShellSort(data,8);for(int i=0;i<8;i++){cout<<data[i]<<endl;}return 0;}
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- 希尔排序
- JAVA中的“抽象接口”
- 如今当下最赚钱的三种商业模式
- Swift的流程控制和函数
- 混淆的概念:SIF、CIF、4CIF、D1
- Android手机在开发调试时logcat不显示输出信息的解决办法
- 希尔排序
- sql 查询 a and b and (c or d);
- Power Designer使用小技巧
- svn 32位转到64位电脑报的错误
- Android自定义控件-dialog
- webstorm css 智能感知 自动完成 autocomplete
- Neural Probabilistic Language Model, word2vec来龙去脉
- Remedy Like问题
- linux 命令之 ip