算法——排序——插入排序(2)——希尔排序
2021-06-04 01:07
120 查看
算法——排序——插入排序(2)——希尔排序
简单插入排序的问题:
假设:数组 arr = {2,3,4,5,6,1} 这时需要插入的数 1(最小), 这样的过程是: {2,3,4,5,6,6} {2,3,4,5,5,6} {2,3,4,4,5,6} {2,3,3,4,5,6} {2,2,3,4,5,6} {1,2,3,4,5,6} 结论: 当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响。
希尔排序:
希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。也就是按数组的下标选择如何进行分组,然后分别对每个分组进行简答插入排序,直到每个组只有一个内容。也就是说按照步长选择和谁一组,然后对每个组进行插入排序,直到步长为1,也就是所有的数为一组,最后再来一个直接插入排序就好了。相当于就是按照一个规定来分组,然后对分组进行插入排序,直到最后全部是一组再来一次。
代码实现希尔排序:
原理比较简单,就是利用步长将其分组,然后对每个分组内部进行直接插入排序,直到最后步长为一也就是所有元素是一个数组后再来一次希尔排序。
void ShellSort(int* a, int len)
{
//第一个for循环用来分组,并且计算步长
for (int Step = len / 2; Step >= 1; Step /= 2)
{
//第二个for循环用来获取分组后有多少个分组
for(int GroupNum = 0;GroupNum<Step;GroupNum++)
{
//第三个for循环用来对每个分组进行直接插入排序
//直接插入排序的第一个for循环用来遍历除了第一个数之外的后面数
for (int CharuNum = GroupNum + Step; CharuNum < len; CharuNum += Step)
{
//第四个for循环用来遍历要插入的位置的前面所有的数
for (int CompareNum = GroupNum; CompareNum < CharuNum; CompareNum += Step)
{
if (a[CharuNum] < a[CompareNum])
{
//第五个for循环用来移动
int temp = a[CharuNum];
for (int Move = CharuNum; Move > CompareNum; Move -= Step)
{
a[Move] = a[Move - Step];
}
a[CompareNum] = temp;
}
}
}
}
}
for (int i = 0; i < len; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
算法效率
希尔排序时间复杂度是 O(n^(1.3-2)),空间复杂度为常数阶 O(1)。希尔排序没有时间复杂度为 O(n(logn)) 的快速排序算法快 ,因此对中等大小规模表现良好,但对规模非常大的数据排序不是最优选择,总之比一般 O(n^2 ) 复杂度的算法快得多。具体的计算方法就比较麻烦了,这里就不展开了。
相关文章推荐
- 【算法拾遗(java描述)】--- 插入排序(直接插入排序、希尔排序)
- 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)
- 算法 2.1节 希尔排序、选择与插入排序的区别、排序的稳定性
- 算法系列(二)冒泡排序、选择排序、插入排序和希尔排序(Java实现)
- 《算法》排序第一天(选择排序、插入排序、希尔排序)
- 笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算
- 已完成以下算法:冒泡排序,插入排序,希尔排序,快速排序,基数排序
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序
- 算法——选择排序、插入排序和希尔排序(改进的插入排序)
- 如何理解插入排序、希尔排序、选择排序、冒泡排序、归并算法、快速排序
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- 算法_基本排序算法之冒泡排序,选择排序,插入排序和希尔排序
- 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版
- Python全栈(二)数据结构和算法之7.选择排序、插入排序和希尔排序的实现
- 【算法】希尔排序,快速排序,选择排序,插入排序,冒泡排序
- 算法和数据结构-选择排序、插入排序及希尔排序 java实现
- 采用回调函数的内部排序算法-插入排序,希尔排序,冒泡,快排,堆排,归并排,基数排序
- java实现排序算法之插入排序(直接插入排序,折半插入排序,希尔排序)
- 算法 —— 选择排序,插入排序,希尔排序