希尔排序

排序算法(第二弹)希尔排序和快速排序

久未见 提交于 2019-11-30 10:57:13
希尔排序和快速排序是两种非常快速的排序算法,希尔排序是插入排序的一种,是对简单插入排序的改进算法。快速排序简称快排,是对冒泡排序的改进算法。这两种排序都是百万千万级别的排序算法,在排大体量数据时第一弹中所讲的三种简单排序算法的效率实在是差强人意。 希尔排序: 排序图解: 动图演示: 排序原理: 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。    简单插入排序很循规蹈矩,不管数组分布是怎么样的,依然一步一步的对元素进行比较,移动,插入,比如[5,4,3,2,1,0]这种倒序序列,数组末端的0要回到首位置很是费劲,比较和移动元素均需n-1次。   而希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,然后分组进行插入排序,随后逐步缩小增量,继续按组进行插入排序操作,直至增量为1。希尔排序通过这种策略使得整个数组在初始阶段达到从宏观上看基本有序,小的基本在前,大的基本在后。然后缩小增量,到增量为1时,其实多数情况下只需微调即可,不会涉及过多的数据移动。 我的代码实现: 1 package cn.ftf.mysort; 2 /* 3 * 我的希尔排序 4 */ 5 import java.util.Arrays; 6 7 public class

希尔排序

生来就可爱ヽ(ⅴ<●) 提交于 2019-11-30 09:29:52
基本思想:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。​根据需求,如果你想要结果从小到大排列,它会首先将数组进行分组,然后将较小值移到前面,较大值移到后面,最后将整个数组进行插入排序,这样比起一开始就用插入排序减少了数据交换和移动的次数,可以说希尔排序是加强 版的插入排序 拿数组5, 2,8, 9, 1, 3,4来说,数组长度为7,当increment为3时,数组分为两个序列5,2,8和9,1,3,4,第一次排序,9和5比较,1和2比较,3和8比较,4和比其下标值小increment的数组值相比较此例子是按照从小到大排列,所以小的会排在前面,第一次排序后数组为5, 1, 3, 4, 2, 8,9第一次后increment的值变为3/2=1,此时对数组进行插入排序, 实现数组从大到小排。 Java实现: public class ShellSort { public static void shellSort(int []numbers) { int temp=0; int j=0; //每次将步长缩短为原来的一半 for(int increment=numbers.length/2;increment>0;increment/=2) { for(int i=increment;i<numbers

希尔排序

☆樱花仙子☆ 提交于 2019-11-30 03:22:01
基本思想 希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。希尔排序是记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 操作方法 操作流程图: 操作步骤 初始时,有一个大小为 10 的无序序列。 (1)在第一趟排序中,我们不妨设 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组。 (2)接下来,按照直接插入排序的方法对每个组进行排序。 在第二趟排序中,我们把上次的 gap 缩小一半,即 gap2 = gap1 / 2 = 2 (取整数)。这样每相隔距离为 2 的元素组成一组,可以分为 2 组。 (3)按照直接插入排序的方法对每个组进行排序。 (4)在第三趟排序中,再次把 gap 缩小一半,即gap3 = gap2 / 2 = 1。 这样相隔距离为 1 的元素组成一组,即只有一组。 (5)按照直接插入排序的方法对每个组进行排序。此时,排序已经结束。 实现效果 代码演示 #include <iostream> using namespace std; int shellSort(int arr[], int n) {

希尔排序学习笔记

﹥>﹥吖頭↗ 提交于 2019-11-30 01:35:59
希尔排序学习笔记是参考这位博主的: http://blog.csdn.net/feixiaoxing/article/details/6844826 希尔排序,。它的基本思想是:首先按照一个序列递减的方法逐渐进行排序。比如说有10个数据,我们按照序列5、3、1的顺序进行排序。首先是5,那么我们对1和6、2和7、3和8、4和9、5和10进行排列;第二轮是3,那么对数据1、4、7、10排列,再对2、5、8进行排列,以及3、6、9排列;第三轮就和冒泡排序一样了,以此对每个数据进行排列。它的优势就是让整个队列基本有序,减少数据移动的次数,从而降低算法的计算复杂度。 第一轮:0和5 1和6 2和7 3和8 4 和9 排序??void shell_sort(int array[], 10, 5) { int inner = 0; int outer = 0; int median = 0; if(NULL == array || 0 == length) return; for(int index = 0; index <5; index ++){ if((length -1) < (index + s5)) //index=0 1 2 3 4往下执行 ,其他情况 continue;相当于break continue; else{ outer = index + 5; while(

排序算法(4):希尔排序

爷,独闯天下 提交于 2019-11-29 10:23:22
基本思想 h有序数组 一个数组中任意间隔为 h h h 的元素都是有序的,那这个数组就是 h有序数组 。如下图所示这个数组就是一个 h h h 有序数组,其中 h = 4 h=4 h = 4 。可以看到,虽然整个数组是乱序的,但任意相隔 h = 4 h=4 h = 4 的元素都是有序的。 希尔排序 希尔排序的思想就是,首先让数组 h h h 有序,然后不断减小 h h h 的值。试想一下,当 h = 1 h=1 h = 1 的时候,数组 h h h 有序也就意味着任意元素和它相邻的元素是有序的,这也就意味着整个数组已经有序了。希尔排序是第一个突破 O ( n 2 ) O(n^2) O ( n 2 ) 的排序算法。 算法流程 首先给 h h h 设置一个初始值(通常可以去数组长度的一半); 遍历数组,使得所有相隔 h h h 的元素组成的子序列有序; 更新 h h h : h = h / 2 h=h/2 h = h / 2 ,重复步骤2,直到 h < 1 h<1 h < 1 ,排序完成。 演示   图中,第一遍排序时 h = 5 h=5 h = 5 ,第二遍 h = 2 h=2 h = 2 ,第三遍 h = 1 h=1 h = 1 ,第三遍排序完成后相邻两个元素有序,因此整个数组有序。 代码实现 public static void shell_sort ( int [ ] arr

希尔排序 | 通俗易懂的理解排序过程

懵懂的女人 提交于 2019-11-29 06:43:48
响应群众需求,今天安排上「希尔排序」。 阅读本文前,请先服用「 插入排序 」,效果更加。 Content 实现过程 关键思路 代码实现 结合代码和中间过程,再体会 算法评价 「希尔排序」🆚 「插入排序」 听说有彩蛋❓ 👀「 更多排序 」 《 冒泡排序 | 通俗易懂的理解排序过程 》 《 选择排序 | 通俗易懂的理解排序过程 》 《 快速排序 | 通俗易懂的理解排序过程 》 《 插入排序 | 通俗易懂的理解排序过程 》 1. 实现过程 对 [5,4,1,3,2] 升序排列,中间步骤 ⬇️ 2. 关键思路 「希尔排序」—— 按固定间隔划分子序列,对每个子序列实现简单插入排序。 这么来看, 「希尔排序」可以拆解成两大步骤 : 划分子序列; 在子序列中简单插入排序。 Q:怎么划分子序列? 等间隔划分 。本例中,初始下标之差按照 d= n//2 计算,之后 d = d//2 循环更新。 先做远距离的移动,再逐渐缩小间隔 。这样,可以减少移动的次数,因为 极端情况,间隔为1时即退化为简单插入排序。 Q:简单插入排序怎么操作? 简单概括 —— 比较、后移、腾位置、插入target 。没看过简单插入排序的,点这里。 3. 代码实现 def ShellSort(arr): def ssort(arr, d): n = len(arr) for i in range(d, n): j = i-d #

Java中的七大排序_2 希尔排序

女生的网名这么多〃 提交于 2019-11-29 01:54:28
希尔排序 简单点说: 将元素进行分组,每组在进行组内的插入排序,在重新分组、排序。直到最后全部元素归为一组,做最后一次插入排序 注意: 将待排元素分为gap组(gap=gap/3+1),开始gap=array.length。每一组元素也不是位置连续的, 而是把每组中的第一个元素连续放在一起,够gap个后在放每一组的第二个元素。 1.第一组:无序区间第一个数key=array[4]=2 2.第二组:无序区间第一个数key=array[5]=4 3.第三组:无序区间第一数key=array[6]=1 4.第四组:无序区间第一个数key=array[7]=5 5.再接着从第一组的无序区间的第二个元素key=array[8]=2开始 直到key第一轮走完全程,第一轮结束的结果 在会分新的组,gap=gap/3+1=4/3+1=2.分为两组 6.重新分为两组后 再重复以上比较移动交换的操作,完成第二次每组的排序 8.走到最后再分组gap=2/3+1=1组 最终比较完成后结果: 代码实现 //希尔排序 public static void shellSort(int[] array) { int gap = array.length;//分组的个数 while (true) { gap = gap / 3 + 1; insertSortWithGap(array, gap);//分组的插入排序

排序---希尔排序

烈酒焚心 提交于 2019-11-28 11:08:35
希尔排序可以说是插入排序的优化,算法的时间复杂度为O(nlogn),算法不稳定 在数字比较多的时候,希尔排序在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动 void ShelSort(int *src, int n) { int i, j, k; int gap, tmp; for (gap = n / 2; gap; gap /= 2) { for (k = 0; k < gap; k++) { for (i = gap + k; i < n; i += gap) { tmp = src[i]; for (j = i; j >= gap && src[j - gap] > tmp; j -= gap) { src[j] = src[j - gap]; } src[j] = tmp; } } } } 来源: https://blog.csdn.net/qq_44783220/article/details/100053570

Python实现希尔排序

拟墨画扇 提交于 2019-11-28 08:18:21
原文: http://blog.gqylpy.com/gqy/271 lst = [i for i in range(20, 0, -1)] length = len(lst) r = length // 2 while r: for i in range(length - r): if lst[i] > lst[i + r]: lst[i], lst[i + r] = lst[i + r], lst[i] r = r // 2 else: for i in range(length - 1): for i in range(i, -1, -1): if lst[i] > lst[i + 1]: lst[i], lst[i + 1] = lst[i + 1], lst[i] 原文: http://blog.gqylpy.com/gqy/271 来源: https://www.cnblogs.com/mypath1/p/11401911.html

希尔排序(附图)

旧巷老猫 提交于 2019-11-28 07:45:25
希尔排序是插入排序的进阶版。 它的基本思想是把一个大的数据集合以条件分割成若干个组合,每个组合进行插入排序。此时插入排序数据量较小,排序的效率更高。 public void xrpx(int arr[]) { for (int interval=arr.length/2; interval>0; interval=interval/2) { for (int j=interval; j<arr.length; j++) { int target = arr[j]; int index = j-interval; while (index >= 0 && target < arr[index]) { arr[index+interval] = arr[index]; index-=interval; } arr[index+interval] = target; } } } 详细步骤解说可以参考:https://blog.csdn.net/qq_39207948/article/details/80006224 来源: https://www.cnblogs.com/z1110/p/11399803.html