数据结构 - 希尔排序(Shell's Sort) 具体解释 及 代码(C++)

数据结构 - 希尔排序(Shell‘s Sort) 具体解释 及 代码(C++)

本文地址: http://blog.csdn.net/caroline_wendy/article/details/24363981

希尔排序(Shell‘s Sort), 又称"缩小增量排序"(Diminishing Increment Sort), 是插入排序的一种.

主要思想是: 先将整个记录, 通过间隔分成若干个子序列, 分别进行插入排序, 待整个序列基本有序时,
再进行一次插入排序.

由于插入排序时, 有可能反复移动数据, 希尔排序, 是一次移动较多的距离(间隔),降低反复移动,
所以减少了时间复杂度.

时间复杂度约为: O(n^(3/2)).

代码例如以下:

/*
 * InsertionSort.cpp
 *
 *  Created on: 2014.4.23
 *      Author: Spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>
#include <deque>

using namespace std;

void print(const std::deque<int>& L) {
	for (auto i : L) {
		std::cout << i << " ";
	}
	std::cout << std::endl;
}

void ShellInsert (std::deque<int>& L, int dk) {
	for(std::size_t i=dk; i<L.size(); ++i) {
		if(L[i] < L[i-dk]) {
			int temp = L[i];
			int j;
			for(j=i-dk; j>=0&&(temp<L[j]); j-=dk)
				L[j+dk] = L[j];
			L[j+dk] = temp;
		}
 	}
	std::cout << "dlta " << dk << " : "; print(L);
}

void ShellSort(std::deque<int>& L, std::deque<int> dlta) {
	for(std::size_t k=0; k<dlta.size(); ++k)
		ShellInsert(L, dlta[k]);
}

int main(void) {
	std::deque<int> L = {49, 38, 65, 97, 76, 13, 27, 49, 55, 04};
	std::deque<int> dlta = {5, 3, 1};
	ShellSort(L, dlta);
	print(L);

}

输出:

dlta 5 : 13 27 49 55 4 49 38 65 97 76
dlta 3 : 13 4 49 38 27 49 55 65 97 76
dlta 1 : 4 13 27 38 49 49 55 65 76 97
4 13 27 38 49 49 55 65 76 97

数据结构 - 希尔排序(Shell's Sort) 具体解释 及 代码(C++)

时间: 2024-07-29 22:53:20

数据结构 - 希尔排序(Shell&#39;s Sort) 具体解释 及 代码(C++)的相关文章

希尔排序Shell sort

希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分, 第一部分,希尔排序介绍 第二部分,如何选取关键字,选取关键字是希尔排序的关键 第一块希尔排序介绍 准备待排数组[6 2 4 1 5 9] 首先需要选取关键字,例如关键是3和1(第一步分成三组,第二步分成一组),那么待排数组分成了以下三个虚拟组: [6 1]一组 [2 5]二组 [4 9]三组 看仔细啊,不是临近的两个数字分组,而是3(分成了三组)的倍数的数字分成了一组, 就是每隔3个数取一个,每隔三个再取一个,这样取出来的数

经典排序算法 - 希尔排序Shell sort

经典排序算法 - 希尔排序Shell sort 希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分, 第一部分,希尔排序介绍 第二部分,如何选取关键字,选取关键字是希尔排序的关键 第一块希尔排序介绍 准备待排数组[6 2 4 1 5 9] 首先需要选取关键字,例如关键是3和1(第一步分成三组,第二步分成一组),那么待排数组分成了以下三个虚拟组: [6 1]一组 [2 5]二组 [4 9]三组 看仔细啊,不是临近的两个数字分组,而是3(分成了三组)的倍数的数字分成了一组, 就是每

希尔排序 Shell Sort

希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进.该方法又称缩小增量排序,因DL.Shell于1959年提出而得名. 希尔排序实质上是一种分组插入方法.它的基本思想是:对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中:然后,对各组内的元素进行直接插入排序. 这一趟排序完成之后,每一个组的元素都是有序的.然后减小gap的值,并重复执行上述的分组和排序.重复这样的操作,当gap

[golang] 数据结构-希尔排序

除了上篇介绍的二分插入排序,还有这次介绍的希尔排序(Shell's Sort),也是对直接插入排序算法的优化. 原理希尔排序,就是按某个增量值对数据进行分组,每组单独排序好后,再缩小这个增量,然后按新增量对数据分组后每个分组再各自排序.最终增加缩小到1的时候,排序结束.所以希尔排序又叫缩小增量排序(Diminishing Increment Sort) 关于增量最佳增量值的选择其实是个数学难题,有兴趣的可以自己搜下相关资料.常用的增量有 n/2(这个又叫希尔增量).n/3.2^k-1(hibba

数据结构 - 堆排序(heap sort) 具体解释 及 代码(C++)

堆排序(heap sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 堆排序包括两个步骤: 第一步: 是建立大顶堆(从大到小排序)或小顶堆(从小到大排序), 从下往上建立; 如建堆时, s是从大到小; 第二步: 是依次交换堆顶和堆底, 并把交换后的堆底输出, 仅仅排列剩余的堆, 从上往下建立; 如构造时, s始终是1; 堆排序(Heap Sort)的时间复杂度是O(nlogn), 最坏情况下也是如此. 而高速排序(Quic

排序之希尔排序(shell sort)

前言 本篇博客是在伍迷兄的博客基础上进行的,其博客地址点击就可以进去,里面好博客很多,我的排序算法都来自于此:一些数据结构方面的概念我就不多阐述了,伍迷兄的博客中都有详细讲解,而我写这些博客只是记录自己学习过程,加入了一些自己的理解,同时也希望给别人提供帮助. 前提故事 骚年在上次与博主进行了直接插入排序的讨论后,找到了博主,说:“博主,对于直接插入排序,我有重大的发现”,博主想了想,就问:“什么发现?”,骚年:“我发现了如下两点” 1)当序列的个数比较少时,直接插入排序效率高:这个好理解,个数

[数据结构]希尔排序

一.问题描述 内部排序是一件具有重大意义的问题,许多项目的实现中都需要用到排序. 我们知道,排序的算法有许多种,每种排序算法的时间复杂度和空间复杂度不尽相同.在解决实际问题时,往往需要根据实际需要选择排序算法. 本实验重点介绍希尔排序的算法实现及其原理,简要说明与其相关的直接排序算法,并讨论希尔排序中步长的选择对排序速度的影响. 二.数据结构——顺序结构 本实验重点在算法实现上,数据结构的思想被弱化了.在排序过程中,由于维护序关系的需要,要有交换的操作,这就破坏了ADT的物理位置的相邻反映逻辑的

希尔排序(Shell)

希尔排序的实质就是分组插入排序,该方法又称缩小增量排序. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高. 就是直接插入排序的升级版,可以和直接插入排序进行对比,就比较容易理解. 1.固定增量r,每次除2 /*

希尔排序(shell)理论---不含源码

|   版权声明:本文为博主原创文章,未经博主允许不得转载. 希尔排序,是一个缩小增量排序.它根据步长来进行排序,步长不同可能会产生不同的序列,但是他们的最终结果是相同的,希尔排序的官方理论难以理解,这里就用非官方的解释来阐述. 原理: >1.加入有n个节点的序列,假设希尔排序的步长i,那么我们第一步就是将这n个节点,每隔i个座位为一组,如下所示(步长i要取好): [n1, n1+i] [n2, ni+2] [...........] [nx, nn] >2.然后每一组两两比较,如n1和n1+