希尔排序

排序算法之希尔排序

假装没事ソ 提交于 2019-11-27 21:50:44
基本思想: 在要排序的一组数中,根据某一增量分为若干子序列,并对子序列分别进行插入排序。 然后逐渐将增量减小,并重复上述过程。直至增量为1,此时数据序列基本有序,最后进行插入排序。 过程: java代码: public int[] shellSort(int[] array) { int incre = array.length; while (true) { incre = incre / 2; for (int k = 0; k < incre; k++) { //根据增量分为若干子序列 for (int i = k + incre; i < array.length; i += incre) { for (int j = i; j > k; j -= incre) { if (array[j] < array[j - incre]) { array[j - incre] = array[j] ^ array[j - incre]; array[j] = array[j] ^ array[j - incre]; array[j - incre] = array[j] ^ array[j - incre]; } else { break; } } } } if (incre == 1) { return array; } } }    来源: https://www

Python实现希尔排序

断了今生、忘了曾经 提交于 2019-11-27 20:50:08
"```python 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] ``` " 来源: https://www.cnblogs.com/zyk01/p/11376086.html

Python实现希尔排序

扶醉桌前 提交于 2019-11-27 15:05:41
原文: http://blog.gqylpy.com/gqy/271 "```python 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/bbb001/p/11367671.html

排序算法--希尔排序

江枫思渺然 提交于 2019-11-27 14:15:24
备忘一下希尔排序。 原理: 希尔排序是插入排序的变种。希尔排序是基于插入排序的以下两点性质而提出改进方法的:插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。 借用百度百科的一段话,之所以希尔排序优于插入排序,原因是,当n值很大时数据项每一趟排序需要的个数很少,但数据项的距离很长。当n值减小时每一趟需要动的数据增多,此时已经接近于它们排序后的最终位置。 正是这两种情况的结合才使希尔排序效率比插入排序高很多。 分析: 至于稳定性,单个插入能保证稳定性,但是多组插入就不能保证组之间的稳定性了,所以它是不稳定的。时间复杂度方面, 好多 资料认为希尔排序时间复杂度会比o(n^2)好一些。空间方面,它是原地的。 代码展示 :我在这里使用的步长d初始为数组的长度的一半,然后不停减半直到1。 public class ShellSort { public static void main(String[] args){ int[] target = {49,38,65,97,76,13,27,49,78,34,12,64,1}; new ShellSort().shell_sort(target); System.out.print("Result:"+" "); for(int k : target)

希尔排序

人盡茶涼 提交于 2019-11-27 14:14:34
希尔排序   希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本,该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量(gap)”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高。         1 """ 2 希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。 3 """ 4 5 6 # 方式一:元素采取直接插入排序从前往后比较 7 def shell_sort(int_list): 8 length = len(int_list) 9 if length <= 1: return int_list 10 step = length // 2 11 12 while step > 0: 13 for i in range(step, length, step): 14 item = int_list[i] 15 for j in range(0, i, step): 16 if int_list[j] > item: 17 for

Python实现希尔排序 -- 2019-08-16 13:40:43

喜夏-厌秋 提交于 2019-11-27 12:41:01
原文: http://blog.gqylpy.com/gqy/271 "```python 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/gqy02/p/11363371.html

排序算法 - 希尔排序

本小妞迷上赌 提交于 2019-11-27 10:56:00
基本思路 希尔排序也是一种插入排序,又称缩小增量排序,在效率上教其他插入排序有较大的改进。 ① d=n /2 ② 将排序序列分为d 个组,在各组内进行 直接插入排序 ③递减 d=d /2,重复② ,直到d =1 算法最后一趟对所有数据进行了 直接插入排序,所以结果一定是正确的。 它的基本思想是:先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。 一趟希尔排序 过程 将记录序列分成若干子 序列,分别对每个子序列进行直接插入排序。 例如:将 n 个记录分成 d 个子序列: 例子: 注意:对于 d=1 的一趟,排序前的数据已将近 正序 ! 希尔排序的分析是一个复杂的问题,因为它的时间是所取“增量”序列的函数,这涉及一些数学上尚未解决的难题。因此,到目前为止尚未有人求得一种最好的增量序列,但大量的研究已得出一些局部的结论。如有人指出,当增量序列为 时,希尔排序的时间复杂度为 ,其中t为排序趟数, 。需注意:应使增量序列中的值没有除1之外的公因子,并且最后一个增量值必须等于1。 为了便于阅读,本例增量直接采用除2法。 算法代码 1 //希尔排序 2 void ShellSort(int *arr, int n) 3 { 4 int i, j; 5 int temp; 6 int d = n / 2; //增量初始值

希尔排序

China☆狼群 提交于 2019-11-27 04:39:16
算法思想 希尔排序算法思想 使用一个增量序列{t1,t2,t3,......tn},其中tn>....>t2>t1=1,其实这个增量序列也可以理解为 间距序列; 设有数组A[k],下标从0开始: 当增量为tn时,从数组首元素A[0]开始,此时距离首元素间隔为tn的元素是A[tn],下一个距离元素A[tn] 间隔为tn的元素是A[tn*2],依次类推,从首元素开始间隔为tn的所有元素,A[0],A[tn],A[2*tn].... A[x*tn]构成了一个分组,其中x*tn<k; 从数组第二个元素A[1]开始,此时距离A[1]间隔为tn的元素是 A[1+tn],下一个距离元素A[1+tn]间隔为tn的元素是A[1+tn*2],依次类推,从首元素开始间隔为tn的所 有元素,A[1],A[1+tn],A[1+2*tn]....A[1+x*tn]构成了一个分组,其中1+x*tn<k; 重复上述步骤,数组中所有的元素都被分组后,然后对每一个分组进行一次插入排序 取增量为tn-1,重复上述步骤进行分组,然后对每一个分组进行一次插入排序,直到取增量为t1时,此时数 组中的元素大致有序,在对整个数组进行一次插入排序,即可排序完成 算法图解 使用希尔排序对4,5,8,2,3,9,7,1进行排序,此时采用增量序列为{1,2,3}, 当增量为3时: 当增量为2时: 当增量为1时: 可以看出当增量为1时

Python实现希尔排序

烈酒焚心 提交于 2019-11-27 02:53:41
原文: http://106.13.73.98/__/46/ 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://106.13.73.98/__/46/ 来源: https://www.cnblogs.com/gafga/p/11339542.html

python实现希尔排序

假装没事ソ 提交于 2019-11-27 02:42:27
python实现希尔排序 希尔排序: 实现分析: 实际上希尔排序就是对插入排序的一种改进而已, 希尔排序是将整个列表当成一个无序序列,并将其分成多个无序序列来进行插入排序,而实现分成多个序列就是需要一个gap步长来实现,对于普通的插入排序gap就是等于1。 我们还是以 __[54,26,93,17,77,31,44,55,20]__为例子。为了分析,我们假设gap先等于2, 图一是我们未划分之前的列表,图二是根据gap划分而来的两个列表,我们需要对每一个列表进行插入排序,排序玩以后得到如下的图 此时步长为2时已经排序完成,现在我们就需要减小步长为1再次进行排序,这时就与普通的插入排序一样了,笔者就不再多说,对于插入排序,可以参考链接: 普通的插入排序实现 . (1)首先我们先把插入排序比较的框架写出来 while i>0: if alist[i]<alist[i-1]: alist[i],alist[i-1]=alist[i-1],alist[i] i-=1 else: break 但是对于希尔排序来说比较的不再是前一个元素,而是以步长来比较的元素,所以这里的1需要改成gap。 (2)对于(1)来说我们仅仅实现了第一步,对于一次进行的排序,而对于一整个序列来说我们需要比较多次,所以我们需要用到一个for循环 for j in range(gap,n ): i=j