【GIF动画+完整可运行源代码】C++实现 希尔排序——十大经典排序算法之四
十大经典排序算法系列博客——>传送门
希尔排序由Shell在1959年发明,又叫缩小增量排序,是第一个突破O(n^2)的排序算法,属于简单插入排序的改进版,会优先比较距离较远的元素。
- 算法步骤:
- 选择一个增量序列T1,T2,…,Tk, 其中Ti>Tj,Tk=1, i>j;
- 每趟排序,根据对应的增量Ti,将待排序列分割成若干子序列,分别对各子序列进行直接插入排序;
- 按增量序列个数k,对序列进行k趟排序。
- 希尔排序实例:
下图的增量序列为:5,2,1,第一趟排序将增量为5的子序列进行插入排序,第二趟排序将增量为2的子序列进行插入排序,第三趟将增量为1的子序列进行插入排序,最终完成排序
代码实现
#include <iostream>using namespace std;int a[] = {70,30,40,10,80,20,90,100,75,60,45};void shell_sort(int a[],int n);
int main()
{cout<<"Before Sort: ";for(int i=0; i<11; i++)cout<<a[i]<<" ";cout<<endl;shell_sort(a, 11);cout<<"After Sort: ";for(int i=0; i<11; i++)cout<<a[i]<<" ";cout<<endl;system("pause");
}void shell_sort(int a[], int n)
{int gap;for(gap = 3; gap >0; gap--){for(int i=0; i<gap; i++){for(int j = i+gap; j<n; j=j+gap){if(a[j]<a[j-gap]){int temp = a[j];int k = j-gap;while(k>=0&&a[k]>temp){a[k+gap] = a[k];k = k-gap;}a[k+gap] = temp;}}}}
}
【GIF动画+完整可运行源代码】C++实现 希尔排序——十大经典排序算法之四相关推荐
- 【GIF动画+完整可运行源代码】C++实现 基数排序——十大经典排序算法之十
十大经典排序算法系列博客-->传送门 基数排序是按照低位先排序,然后收集:再按照高位排序,然后再收集:依次类推,直到最高位.有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序.最 ...
- 【GIF动画+完整可运行源代码】C++实现 堆排序——十大经典排序算法之七
十大经典排序算法系列博客-->传送门 堆排序Heapsort是指利用堆这种数据结构所设计的一种排序算法.堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大 ...
- 【GIF动画+完整可运行源代码】C++实现 快速排序——十大经典排序算法之六
十大经典排序算法系列博客-->传送门 ##### 1.快排的实现逻辑: 先从数列中取出一个数作为基准数(通常取第一个数). 遍历序列,将比它小的数与比它大的数分别记录下来,分为两类,最后该数放在 ...
- 【GIF动画+完整可运行源代码】C++实现 归并排序——十大经典排序算法之五
十大经典排序算法系列博客-->传送门 简介:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,是采用分治法Divide and Conquer的一个非常典型的应用.分Divide: ...
- 【GIF动画+完整可运行源代码】C++实现 插入排序——十大经典排序算法之三
十大经典排序算法系列博客-->传送门 插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法步骤: 从第一个元素开始,该元素认为已经被排序: ...
- 【GIF动画+完整可运行源代码】C++实现 冒泡排序——十大经典排序算法之一
十大经典排序算法系列博客-->传送门 冒泡排序重复地遍历待排序的数列,每次比较两个相邻元素,如果它们的顺序错误就把它们交换.重复地进行遍历直到没有再需要交换时表示数列已经排序完成. 算法步骤: ...
- C++实现桶排序——十大经典排序算法之九【GIF动画+完整代码+详细注释】
十大经典排序算法系列博客-->传送门 桶排序是计数排序的升级版.它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定.桶排序 (Bucket sort)的工作的原理:假设输入数据服从均 ...
- 【GIF动画+完整可运行源代码】C++实现 计数排序——十大经典排序算法之八
十大经典排序算法系列博客-->传送门 计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中. 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确 ...
- 【GIF动画+完整可运行源代码】C++实现 选择排序——十大经典排序算法之二
十大经典排序算法系列博客-->传送门 选择排序是一种简单直观的排序算法,首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的 ...
最新文章
- 冬奥会夺金的背后杀手锏,竟是位 AI 虚拟教练
- Apache commons email 使用过程中遇到的问题
- android log时间,android – Logcat的日志时间戳不按顺序排列
- php如何导入大文件数据库,PHP读取CSV大文件导入数据库的示例
- python数据挖掘试题四十道,你敢来挑战吗?
- 登录状态保持Session/Cookie
- 打破冷漠僵局文章_研究僵局–第1部分
- 【渝粤教育】国家开放大学2018年春季 0062-21T港台文学专题讲座 参考试题
- 如何在Python中针对一个值检查多个变量?
- silverlight 3D 游戏开发
- [vue] vue能监听到数组变化的方法有哪些?为什么这些方法能监听到呢?
- Java虚拟机(JVM)面试题大集合
- 性能优化实战案例——助力某移动OA系统
- Fiddler-学习笔记-远程抓包
- 遗传算法工具箱约束优化例题
- 为什么要参加PMP考前培训?有什么好处?
- pdffactory字体打印不对_【原创】pdfFactory Pro有关转换PDG图像质量下降解决途径
- 计算机数学基础:斜率与截距、导数、权重的关系
- html5手机端页面缩放问题的解决
- Navicat premium 12 闪退问题(非有道词典问题)