排序——希尔排序

简介: 排序——希尔排序

03ec969cbe3e4106b9e8833bb030a5ef.png希尔排序的基本思想

希尔排序又称缩小增量排序,因 DL. Shell于 1959 年提出而得名。先将待排序表按照一定的间隔分割成多个子表,对各个子表分别进行直接插入排序。缩小增量d,重复上述过程,知道d=1 为止。

步骤

image.png

过程演示

  1. 初始序列b95dbced325a8c54b3bc327aa1800f74.png
  2. 第一趟,初始增量取d=length/2=10/2=5e94d16c18f726fe65873a36c2ea754a1.png
  3. 第二趟,修改增量 d =d/2=2608b797fffcd3d400ab3aa3e500b4c6e.png
  4. 第三趟,修改增量 d=d/2=1,得到最终排序结果8b4759e83256a79253afd634b95a39bd.png

算法代码

#include<iostream>usingnamespacestd;
//希尔排序 voidShellSort(intnums[],intn){
intd,i,j,temp;
for(d=n/2;d>=1;d/=2){                           //初始增量:d/2,d=1结束 for(i=d;i<n;i++){                           //每一趟使用直接插入排序 temp=nums[i];                       
for(j=i;j>=d&&temp<nums[j-d];j-=d){
nums[j]=nums[j-d];
            }
nums[j]=temp;
        }
    }
}
//打印数组 voidprintNum(intnumbers[],intn){
for(inti=0;i<n;i++){
cout<<numbers[i]<<" ";
    }
}
intmain()
{
intnumbers[10]={3,44,38,5,47,15,36,26,1,2};
intn=sizeof(numbers)/sizeof(numbers[0]);   //数组长度 ShellSort(numbers,n);       //调用 InsertSort 函数进行插入排序 printNum(numbers,n);        //打印数组 return0;
}

注:当 d=1 时,希尔排序会变成直接插入排序


算法性能分析

image.png


image.png



目录
相关文章
|
9月前
|
机器学习/深度学习 算法 搜索推荐
数据结构实验之排序六:希尔排序
数据结构实验之排序六:希尔排序
|
9月前
|
搜索推荐 算法 Shell
排序——插入排序
排序——插入排序
59 0
|
9月前
|
搜索推荐 算法
排序——计数排序
排序——计数排序
43 0
|
存储 搜索推荐 测试技术
排序篇(一)----插入排序
排序篇(一)----插入排序
62 0
认识O(NlogN)的排序(二)
认识O(NlogN)的排序(二)
73 0
认识O(NlogN)的排序(一)
认识O(NlogN)的排序(一)
64 0
|
存储 搜索推荐 测试技术
排序(1)之插入排序
从今天小编就开始给大家介绍排序的内容,对于排序内容我们一共分,插入,选择,交换,归并这几个大类,那么今天小编给大家带来的就是插入排序
115 0
|
移动开发 算法 Shell
算法之排序5——希尔排序
依次比较待插入元素 i 和分组内另一个元素,就需要用到for循环语句;当h = 5 时,a[5]恰好是数组内第6个元素,也就是第一个待插入的元素,所以初始条件是 i = h,待插入的最后一个元素就是数组内最后一个元素,即终止条件为 i < a.length
144 0
|
算法 搜索推荐 Java
排序:希尔排序(算法)
(注:如果想更好的理解希尔排序,请先看看我的上一篇博客插入排序,希望会对你有帮助。)
348 0
排序:希尔排序(算法)
|
算法 搜索推荐
排序——归并排序和计数排序
介绍归并排序和计数排序
129 0
排序——归并排序和计数排序