首页 > 编程语言 >希尔排序的思路与C++实现

希尔排序的思路与C++实现

时间:2023-01-14 11:05:03浏览次数:64  
标签:25 arr int C++ 希尔 排序 94 inc



tags: DSA C++ Sort

写在前面

写一下希尔排序, 其实就是插入排序的升级版, 不是一次移动一个, 而是一次移动一组.

回顾插入排序

void InsertionSort(vector<int> &arr) {
int n = arr.size();
for (int i = 1; i < n; ++i) {
int tmp = arr[i], j = i;
for (; j >= 0 && arr[j - 1] > tmp; --j) arr[j] = arr[j - 1];
arr[j] = tmp;
}
}

原理

这里参考了维基百科的原理分析,

​希尔排序 - 维基百科,自由的百科全书 (wikipedia.org)​​;

例如,假设有这样一组数[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],如果我们以步长为5开始进行排序,我们可以通过将这列表放在有5列的表中来更好地描述算法,这样他们就应该看起来是这样:

13 14 94 33 82
25 59 94 65 23
45 27 73 25 39
10

然后我们对每列进行排序:

10 14 73 25 23
13 27 94 33 39
25 59 94 65 82
45

将上述四行数字,依序接在一起时我们得到:[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ].这时10已经移至正确位置了,然后再以3为步长进行排序:

10 14 73
25 23 13
27 94 33
39 25 59
94 65 82
45

排序之后变为:

10 14 13
25 23 33
27 25 59
39 65 73
45 94 82
94

最后以1步长进行排序(此时就是简单的插入排序了)。

代码

// 希尔排序, 递减增量排序算法
void ShellSort(vector<int>& arr) {
int n = arr.size(), group = 3;
// group:组数(行数), inc:间隔(列数)
// 当间隔减小到1时, 完成排序
for (int inc = n / group; inc > 0; inc /= group)
// 对列做插入排序
for (int i = inc; i < n; ++i) {
int tmp = arr[i], j = i;
for (; j >= inc && arr[j - inc] > tmp; j -= inc)
arr[j] = arr[j - inc];
arr[j] = tmp;
}
}

从代码中可以看到, 希尔排序只是给插入排序套了一个外壳, 不同点在于新增加了步长和组数两个参数, 这就导致了其速度要快于插入排序.


标签:25,arr,int,C++,希尔,排序,94,inc
From: https://blog.51cto.com/u_15366127/6007531

相关文章

  • 快速排序算法的递归,迭代法实现(C++)
    tags:DSAC++Sort思路分治法主要分成下面三个步骤:选定基准值(默认是数组首元素),这里称为pivot找到基准值待放置的位置(排序之后的位置),将大于基准值的元素放在基准值......
  • C++ 算法进阶系列之从 Brute Force 到 KMP 字符串匹配算法的优化之路
    1.字符串匹配算法所谓字符串匹配算法,简单地说就是在一个目标字符串中查找是否存在另一个模式字符串。如在字符串ABCDEFG中查找是否存在EF字符串。可以把字符串ABCDE......
  • 【计算几何】极角排序
    前置知识三角函数。引文给定一个中心点\(O\)与\(n\)个点,求按点与\(O\)的连线与\(x\)轴的夹角排序后的点对。正文显而易见,不论我们如何移动\(O\)点,点对都......
  • 【数据结构与算法】排序算法(Go实现)
    基础排序算法插入排序funcInsertSort(nums[]int){fori:=1;i<len(nums);i++{val:=nums[i]j:=iforj>0&&nums[j-1]>......
  • C++|开发工具
    前言学习c++就需要有合适的开发工具,本文将介绍如何安装开发工具。一、VisualStudio官网下载进入后,向下划,看到“了解VisualStudio系列”,选择使用于你的电脑操作系......
  • C++利用easyX实现一个简单图形化窗口
    在实现这个图形化窗口过程中遇到了一些琐碎的问题,不过还是解决了首先easyX下载地址https://easyx.cn/download下载之后安装到VS上或者自己想使用的软件上就行1#incl......
  • 用指针数组的形式来比较两个有序数组数据与排序方式是否完全相同
    1#include<iostream>2#include<vector>3usingnamespacestd;4intmain()5{6inta[5]={1,2,3,4,5};//定义两个数组7intb[5]={1,2......
  • 什么是希尔排序?
    本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!作者|慕课网精英讲师JdreamZhang希尔排序(ShellSort),是计算机科学与技术领域中较为简单的一种排序算法。......
  • C++ STL容器的Value语义与Reference语义
    C++STL容器的Value语义与Reference语义1.Value语义vs.Reference语义1.1两种语义简述​ 通常情况下,所有容器都是建立元素的copy,返回的元素的copy。因此,容器内的元素与......
  • 洛谷P7792 KRIZA 题解 C++
    洛谷P7792KRIZA题解C++题目概述:题目传送门Sisyphus在一个圆形的房间里,房间内有n扇锁着的门,他有n把钥匙,其中第i把钥匙对应第$v_i$扇门,遇到不匹配的钥匙就放......