希尔排序

算法排序之希尔排序

倾然丶 夕夏残阳落幕 提交于 2020-02-07 01:25:56
算法思想 希尔排序其实就是在插入排序的基础上,增加了一个增量,每次为元素划分不同的组 。 该图片转载于此 /** * 希尔排序的实现 希尔排序其实就是在插入排序的基础上,增加了一个增量,每次为元素划分不同的组 * 克服了插入排序相邻两个元素交换的缺点,两个距离较远的元素也可以进行交换。 * @author qiu *思想:定义增量序列DM>DM-1>...>D1=1 *对每个Dk进行“Dk-间隔”排序(K=M,M-1,....1) *最坏的情况T=O(N^2) *缺点:不稳定。 */ public class XiErSort { /** * 原始希尔排序 * @param args */ public static void main ( String [ ] args ) { int [ ] a = { 1 , 8 , 2 , 11 , 20 , 0 } ; for ( int i = 0 ; i < a . length ; i ++ ) { System . out . print ( a [ i ] + " " ) ; } System . out . println ( ) ; shell_sort ( a , a . length ) ; for ( int i = 0 ; i < a . length ; i ++ ) { System . out . print

希尔排序

陌路散爱 提交于 2020-02-06 11:19:45
b站看到,自写练习 思想: 1,就是在插入排序的基础上每次让他跳跃式的进行交换排序,每一轮排序完后让gap的值减为上次的一半,缩小跳跃间隔,再次进行排序,当gap==1的时候,就是插入排序,具体代码如下 2,平均时间复杂度 O(nlogn) import java.util.Arrays; public class Sort { public static void main(String[] args) { int[] arr = {19,91,8,17,1,9,5,99,9,56,2,94,56,22}; // quickSort(arr, 0, arr.length - 1); xierSort(arr); System.out.println(Arrays.toString(arr)); } public static void xierSort(int[] arr) { int gap=arr.length; while (true) { gap=gap/2; for(int i=0;i<gap;i++) { for(int j=gap+i;j<arr.length;j+=gap) { int temp=arr[j]; int k=j-gap; //如果不把k设为j-gap可能会有数组越界的风险,我用k=j 一直没有算对, while (k>=0&&arr[k]>temp

希尔排序

最后都变了- 提交于 2020-02-06 10:36:56
基本思想 1、将整个待排序记录 分割成若干个子序列 , 2、在子序列内 分别 进行直接插入排序, 3、待整个序列中的记录基本有序时,对全体记录进行直接插入排序。 关键问题 1、分割待排序记录的目的是:1、减少待排序记录数目。2、使序列向基本有序发展。 2、如何分割? 子序列的构成不能是简单地“逐段分割”,而是将相距某个“增量”的记录组成一个子序列。 (1)分割解决方法: 将相隔某个“增量”的记录组成一个子序列。 增量应如何取? 希尔最早提出的方法是d1=n/2,di+1=di/2。 算法描述: for (d=n/2; d>=1; d=d/2) { 以d为增量,进行组内直接插入排序; } 具体实现 void Shellsort(int r[],int n){ for (d=n/2; d>=1; d=d/2){ //设定初始的“增量d”为n/2 for (i=d+1; i<=n; i++) { //前d个数是一个子序列,则从第二个子序列开始对应比较 r[0]=r[i]; //暂存待插入记录 j=i-d; //变量j存待插记录前一个子序列相对应的比较位置。 while (j>0 && r[0]<r[j]) //j从最后一个序列向前比较 { r[j+d]=r[j]; //如果小于前面的序列,前面的序列后移d个位置 j=j-d; //j减小d,继续向前面的前面序列比较 } r[j+d]=r

【Python数据结构与算法笔记day30】6.5. 希尔排序

℡╲_俬逩灬. 提交于 2020-02-01 22:24:33
文章目录 6.5. 希尔排序 希尔排序 希尔排序过程 希尔排序的分析 时间复杂度 希尔排序演示 6.5. 希尔排序 希尔排序 希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 希尔排序过程 希尔排序的基本思想是:将数组列在一个表中并对列分别进行插入排序,重复这过程,不过每次用更长的列(步长更长了,列数更少了)来进行。最后整个表就只有一列了。将数组转换至表是为了更好地理解这算法,算法本身还是使用数组进行排序。 例如,假设有这样一组数[ 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

希尔排序

核能气质少年 提交于 2020-01-31 14:37:43
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。 希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。 def shellSort(arr): n = len(arr) gap = int(n/2) while gap > 0: for i in range(gap,n): temp = arr[i] j = i while j >= gap and arr[j-gap] >temp: arr[j] = arr[j-gap] j -= gap arr[j] = temp gap = int(gap/2) arr = [ 12, 34, 54, 2, 3] n = len(arr) print ("排序前:") for i in range(n): print(arr[i]), shellSort(arr) print ("\n排序后:") for i in range(n): print(arr[i]) 执行以上代码输出结果为: 排序前: 12 34 54 2 3 排序后: 2 3 12 34 54 参考https://www.runoob.com/python3/python3-examples.html 来源: https:/

排序算法-希尔排序(Shell Sort)

自作多情 提交于 2020-01-29 16:37:12
文章目录 希尔排序法介绍 希尔排序法算法 时间复杂度 稳定性 其他排序法的比较 希尔排序法介绍 希尔排序法(Shell Sort)是 D.L.Shell 于1959年提出的一种排序算法,是 直接插入排序法 的更高效的改进版。在这之前的排序算法如 冒泡排序 、 简单选择排序 、 直接插入排序 等算法的的时间复杂度都为 O ( n 2 ) O(n^{2}) O ( n 2 ) ,而希尔排序突破了这一时间复杂度。 【原理】 直接插入排序算法比冒泡排序和简单选择排序性能都要高,尤其在序列基本有序并且记录数相对较少的情况,只需要简单的几个插入动作就能完成排序。 希尔排序的思路就是在插入排序算法的基础上,创造插入排序算法的有利条件,将序列按照某个增量分成多个子序列进行插入排序,使整个序列变为基本有序,并且由于按照增量分了子序列,所以每个子序列的记录数变少了,增量和子序列长度成反比,增量从小于n的某个值每次递减,子序列随增量变小而变长。直到增量变为1,使其所有记录为一个整体序列然后进行一次插入排序为止。 什么才叫基本有序呢?比如{2,1,4,3,5,6,8,7,9}可以说是基本有序,小的数字基本在序列的前部,不大不小的在中部,大的数字在后部。 {8,7,6,3,9,2,4,5,1}这样的序列就不是基本有序,因为1在序列的最后,9在中间,8在第一位,所以谈不上是基本有序的。 【例子】

希尔排序

久未见 提交于 2020-01-27 20:21:54
一:什么是希尔排序 希尔排序基于插入排序,并添加了新特性,提高效率. 二:插入排序的缺陷 加入一个很小的数值排在最末尾,如果需要正确排序,则需要将所有的数据都向右移动才可以将小的数据排到前面 缺陷: 移动次数太多 三:希尔排序的优点 加大排序中元素之间的间隔,对这些间隔的元素进行插入排序,使数据可以大幅度移动,当完成间隔排序后,希尔排序会减少间隔之间的元素再进行排序,依次进行下去 四:间隔计算 间隔h的初始值为1,通过 h = 3*h + 1 来计算循环,直到该间隔大于数组的大小时停止.最大间隔为不大于数组大小的最大值 五:间隔减少 公式: h = (h -1)/3 六:代码实现 public class ShellSort { public static void main ( String [ ] args ) { long [ ] arr = { 3 , 4 , 7 , 2 , 1 , 0 , 8 } ; sort ( arr ) ; System . out . println ( Arrays . toString ( arr ) ) ; } //希尔排序 public static void sort ( long [ ] arr ) { //初始化间隔 int h = 1 ; //计算最大间隔 while ( h < arr . length / 3 ) { h =

希尔排序

泄露秘密 提交于 2020-01-26 03:39:11
#include<stdio.h> void insert(int a[],int gap,int i) { int x=a[i],j; for(j=i-gap; j>0 && x<a[j]; j-=gap) a[j+gap]=a[j]; a[j+gap]=x; } void shellsort(int a[],int n) { for(int gap=n/2; gap>0; gap/=2) for(int i=gap; i<=n; i++) insert(a,gap,i); } int main() { int a[100],n; scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%d",&a[i]); shellsort(a,n); for(int i=1; i<=n; i++) printf("%d ",a[i]); printf("\n"); return 0; } 来源: CSDN 作者: 相似的人适合打闹 链接: https://blog.csdn.net/AYSXY/article/details/103112452

希尔排序

試著忘記壹切 提交于 2020-01-24 14:54:15
希尔排序 **时间复杂度:**最好 O(N) 最坏 O(n ^ 2) 稳定性: 比较时加了" = ",则不稳定,否则稳定 实现: 组内直接插入排序,最后看成一组,进行插入排序。 思想与直接插入排序类似,不过增量变成了组的差值(这是因为在进行组内排序) 分组-》组内插入排序-》最后看成一组 代码示例: public static void shell ( int [ ] array , int gap ) { for ( int i = gap ; i < array . length ; i ++ ) { int tmp = array [ i ] ; int j = i - gap ; for ( ; j >= 0 ; j -= gap ) { if ( array [ j ] > tmp ) { array [ j + gap ] = array [ j ] ; } else { break ; } } array [ j + gap ] = tmp ; } } public static void shellSort ( int [ ] array ) { //这里先分为5组,再分为3组,之后看成一组 int [ ] drr = { 5 , 3 , 1 } ; for ( int i = 0 ; i < drr . length ; i ++ ) { shellSort (

希尔排序

孤者浪人 提交于 2020-01-20 00:12:09
排序算法目录: 1.插入排序 2.希尔排序 3.选择排序 4.冒泡排序 5.快速排序 6.计数排序 7.堆排序 图解希尔排序: 选定一个整数,分组,相同距离的在同一组内,并对每一组进行排序,然后重复上述分组和排序的工作,当到达=1时,所有记录在统一组内排好序。 代码实现: void ShellSort ( int * array , int size ) //希尔排序 { int i = 0 ; int j = 0 ; int n = 0 ; int gap = 0 ; for ( gap = size / 2 ; gap > 0 ; gap / = 2 ) { for ( i = 1 ; i < size ; i + = gap ) { n = array [ i ] ; j = i - gap ; while ( j >= 0 && n < array [ j ] ) { array [ j + gap ] = array [ j ] ; j - = gap ; } array [ j + gap ] = n ; } } } 来源: CSDN 作者: *空白* 链接: https://blog.csdn.net/weixin_43697119/article/details/104011496