排序——希尔排序

简介: 排序——希尔排序

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



目录
相关文章
|
7月前
|
搜索推荐 算法 Shell
排序——插入排序
排序——插入排序
49 0
|
7月前
|
算法 搜索推荐
排序——选择排序
排序——选择排序
75 0
|
存储 搜索推荐 测试技术
排序篇(一)----插入排序
排序篇(一)----插入排序
51 0
|
算法 搜索推荐 索引
排序篇(二)----选择排序
排序篇(二)----选择排序
38 0
|
存储 搜索推荐 测试技术
排序(1)之插入排序
从今天小编就开始给大家介绍排序的内容,对于排序内容我们一共分,插入,选择,交换,归并这几个大类,那么今天小编给大家带来的就是插入排序
105 0
|
移动开发 算法 Shell
算法之排序5——希尔排序
依次比较待插入元素 i 和分组内另一个元素,就需要用到for循环语句;当h = 5 时,a[5]恰好是数组内第6个元素,也就是第一个待插入的元素,所以初始条件是 i = h,待插入的最后一个元素就是数组内最后一个元素,即终止条件为 i < a.length
132 0
算法之排序5——希尔排序
|
索引
掌握常见的几种排序-选择排序
选择排序是一种简单的排序,时间复杂度是O(n^2),在未排序的数组中找到最小的那个数字,然后将其放到起始位置,从剩下未排序的数据中继续寻找最小的元素,将其放到已排序的末尾,以此类推,直到所有元素排序结束为止。
122 0
掌握常见的几种排序-选择排序
|
算法 搜索推荐 Java
排序:希尔排序(算法)
(注:如果想更好的理解希尔排序,请先看看我的上一篇博客插入排序,希望会对你有帮助。)
331 0
排序:希尔排序(算法)
|
算法 搜索推荐
排序——归并排序和计数排序
介绍归并排序和计数排序
115 0
排序——归并排序和计数排序
|
算法
排序——直接插入排序
排序——直接插入排序
114 0
排序——直接插入排序