数据结构与算法——谢尔排序

2024-01-27 09:20

本文主要是介绍数据结构与算法——谢尔排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

谢尔排序就是每隔一段距离的一个子序列进行插入排序;间隔是从大到小发生改变。谢尔排序也称为缩减增量排序。

比如数据序列v: 81 94 11 96 12 35 17 95 28 58 41 75 15 (序列个数为13)

增量序列是:h1, h2, h3, ......, hk

谢尔增量序列是:hk=N/2, hk-1=hk/2, .....(N是序列的数据个数)

Hibbard增量序列:{1, 3, ..., 2^k-1}

Sedgewick增量序列:{1, 5, 19, 41, 109..}该序列中的项或者是9*4^i - 9*2^i + 1或者是4^i - 3*2^i + 1;

 间隔6的子序列是:

1

排序之前v: 81 94 11 96 12 35 17 95 28 58 41 75 15 

81, 17, 15 -----》子序列插入排序之后是-----15, 17, 81

排序之后v: 15 94 11 58 12 35 17 95 28 96 41 75 81

2

排序之前v: 15 94 11 58 12 35 17 95 28 96 41 75 81

94, 95     -----》子序列插入排序之后是-----94, 95

排序之后v: 15 94 11 58 12 35 17 95 28 96 41 75 81

3

排序之前v: 15 94 11 58 12 35 17 95 28 96 41 75 81

11, 28     -----》子序列插入排序之后是-----11, 28

排序之后v: 15 94 11 58 12 35 17 95 28 96 41 75 81

4

排序之前v: 15 94 11 58 12 35 17 95 28 96 41 75 81

58, 96     -----》子序列插入排序之后是-----》 58, 96

排序之后v: 15 94 11 58 12 35 17 95 28 96 41 75 81

5

排序之前v: 15 94 11 58 12 35 17 95 28 96 41 75 81

12, 41     -----》子序列插入排序之后是-----》 12, 41

排序之后v: 15 94 11 58 12 35 17 95 28 96 41 75 81

6

排序之前v: 15 94 11 58 12 35 17 95 28 96 41 75 81

35, 75     -----》子序列插入排序之后是-----》 35, 75

排序之后v: 15 94 11 58 12 35 17 95 28 96 41 75 81

 

所有的间隔为6的子序列排序之后的序列输出是:v: 15 94 11 58 12 35 17 95 28 96 41 75 81

(见输出结果6: 15 94 11 58 12 35 17 95 28 96 41 75 81):

 间隔3的子序列是:

1

排序之前v: 15 94 11 58 12 35 17 95 28 96 41 75 81 

15, 58, 17, 96, 81 -----》子序列插入排序之后是-----15, 17, 58, 81, 96

排序之后v: 15 94 11 17 12 35 58 95 28 81 41 75 96

2

排序之前v: 15 94 11 17 12 35 58 95 28 81 41 75 96

94, 12, 95, 41     -----》子序列插入排序之后是-----12, 41, 94, 95

排序之后v: 15 12 11 17 41 35 58 94 28 81 95 75 96

3

排序之前v: 15 12 11 17 41 35 58 94 28 81 95 75 96

11, 35, 28, 75     -----》子序列插入排序之后是-----11, 28, 35, 75

排序之后v: 15 12 11 17 41 28 58 94 35 81 95 75 96

(其实到这一步的时候,这个已经是间隔为3这种情况下最后的输出结果了。

见输出结果3: 15 12 11 17 41 28 58 94 35 81 95 75 96

 间隔1的子序列是:

v:15 12 11 17 41 28 58 94 35 81 95 75 96

此时其实就相当于是直接对v进行一次插入排序。

排序输出结果是:

v: 11 12 15 17 28 35 41 58 75 81 94 95 96

运行输出结果:

v: 81 94 11 96 12 35 17 95 28 58 41 75 15 

6: 15 94 11 58 12 35 17 95 28 96 41 75 81 

3: 15 12 11 17 41 28 58 94 35 81 95 75 96 

1: 11 12 15 17 28 35 41 58 75 81 94 95 96 

v: 11 12 15 17 28 35 41 58 75 81 94 95 96


 


用谢尔增量实现谢尔排序的源代码:

/*************************************************************************> File Name: shellsort.cpp> Author: > Mail: > Created Time: 2016年01月08日 星期五 22时16分24秒************************************************************************/#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;int main()
{vector<int> v;v.push_back(81);v.push_back(94);v.push_back(11);v.push_back(96);v.push_back(12);v.push_back(35);v.push_back(17);v.push_back(95);v.push_back(28);v.push_back(58);v.push_back(41);v.push_back(75);v.push_back(15);cout << "v: ";copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));cout << endl;for (int gap = v.size()/2; gap > 0; gap /= 2){//增量序列for (int i = gap; i < v.size(); ++i){//对间隔为gap的子序列进行插入排序int tmp = v[i];int j = i;for ( ; j >= gap && tmp < v[j-gap]; j -= gap)v[j] = v[j-gap];v[j] = tmp;}cout << gap << ": ";copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));cout << endl;}cout << "v: ";copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));cout << endl;return 0;
}




这篇关于数据结构与算法——谢尔排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/649805

相关文章

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

Java List排序实例代码详解

《JavaList排序实例代码详解》:本文主要介绍JavaList排序的相关资料,Java排序方法包括自然排序、自定义排序、Lambda简化及多条件排序,实现灵活且代码简洁,文中通过代码介绍的... 目录一、自然排序二、自定义排序规则三、使用 Lambda 表达式简化 Comparator四、多条件排序五、

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘