日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

希尔排序增量研究

發布時間:2025/3/21 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 希尔排序增量研究 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ? 上一篇介紹了希爾排序,它又被稱為縮小增量排序,這就說明了增量在希爾排序中的重要性。

? ? ? ? 本篇使用四組不同的增量,通過統計排序的比較次數、移動次數、執行時間,來討論不同的增量對希爾排序效率的影響。

? ? ? ? 選取的增量:h1=N/2, N/4, N/8,……,1(每次增量減半)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?h2=N/3, N/9, N/27,……,1(每次增量為原來的三分之一)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?h3=2?-1 (h=1,3,7,……)(增量為奇數)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?h4=(3?-1)/2 (h=1,4,13,……)

? ? ? ? 1、保持序列元素個數不變

? ? ? ? 保持序列元素個數為1000000,每次隨機生成不同的序列,對四個增量分別做4組排序。

增量h比較次數移動次數執行時間(ms)平均時間(ms)
h17089931753401514390409
7124864653751082437
6312521645628028406
6570920048211399406
h25890853847827463328367
5727156646192005360
5874505047664214422
5815811847077871359
h36333783545942623391434
6226148444866301422
6450740047112762485
6593213948537533438
h46760093856206667359398
6242837451034112390
6786768556472626453
6379458952400141391

? ? ? ??從測試的結果來看,當序列元素個數相同時,對四種增量分別用生成的四組隨機數排序時,它們的比較次數、移動次數以及執行時間等參數差別不大。因此可以認為對于待排序列的元素個數相同的情況下,基于以上四種增量的序列,希爾排序算法的時間復雜度差異不是很明顯,執行效率差別不大。

? ? ? ? 2、序列的元素個數改變

? ? ? ? 使序列元素個數增加,分別取10000、100000、1000000、10000000,每次隨機生成不同的序列,對四個增量分別排序。

元素個數增量h比較次數移動次數執行時間(ms)
10000h12663011513880
h22421501713890
h323788112934615
h42386861678160
100000h14270009282047632
h24174584326707615
h33959590254303732
h43867292294153431
1000000h16689087849393622422
h25919087748110274360
h35987290642478486406
h46280542251410564375
10000000h110352502298202610495301
h2116756015410368128895532
h39801271577721501775294
h496596049558545085985378

? ? ? ? 從測試結果可以看出,不同長度的序列使用四個增量分別進行排序時,比較次數、移動次數、排序時長有一定差異。當元素個數較少時,增量為h2=N/3, N/9, N/27,……,1的希爾排序效率比其他增量略高;

當元素個數較多時,增量為h4=(3?-1)/2 (h=1,4,13,……)的希爾排序效率比其他增量略高。

? ? ? ? 綜上所述,希爾排序算法在不同增量下的執行效率也不盡相同,增量是影響希爾排序效率的重要因素。遺憾的是,雖然有很多論文專門研究過不同的增量對希爾排序的影響,但都無法證明某個增量是最好的。因此在使用希爾排序時,根據排序序列的大小,選取適當的增量對提高排序效率很有幫助。

? ? ? ??參考代碼:以Java為例。

import java.util.Random;/** 希爾排序*/public class ShellSort {//增量h=N/2static long comp1 = 0; //比較次數static long exch1 = 0; //交換次數public static void sort1(int[] a) {int n = a.length; //序列長度int h = n/2; //初始增量h為序列長度的一半while (h >= 1) {for (int i = h; i < n; i++) {for (int j = i; j >= h; j -= h) {comp1++;if(a[j]<a[j-h]){int swap = a[j];a[j] = a[j-h];a[j-h] = swap;exch1++;}else{break;}}}h /= 2; //增量減半 }}//增量h=N/3static long comp2 = 0; //比較次數static long exch2 = 0; //交換次數public static void sort2(int[] a) {int n = a.length; //序列長度int h = n/3; //初始增量h為序列長度的三分之一while (h >= 1) {for (int i = h; i < n; i++) {for (int j = i; j >= h; j -= h) {comp2++;if(a[j]<a[j-h]){int swap = a[j];a[j] = a[j-h];a[j-h] = swap;exch2++;}else{break;}}}h /= 3; //增量減為三分之一 }}//增量h=2?-1 (h=1,3,7……)static long comp3 = 0; //比較次數static long exch3 = 0; //交換次數public static void sort3(int[] a) {int n = a.length; //序列長度int h = 1;while (h < n/2) h = 2*h + 1;while (h >= 1) {for (int i = h; i < n; i++) {for (int j = i; j >= h; j -= h) {comp3++;if(a[j]<a[j-h]){int swap = a[j];a[j] = a[j-h];a[j-h] = swap;exch3++;}else{break;}}}h /= 2;}}//增量h=(3?-1)/2 (h=1,4,13……)static long comp4 = 0; //比較次數static long exch4 = 0; //交換次數public static void sort4(int[] a) {int n = a.length; //序列長度int h = 1;while (h < n/3) h = 3*h + 1;while (h >= 1) {for (int i = h; i < n; i++) {for (int j = i; j >= h; j -= h) {comp4++;if(a[j]<a[j-h]){int swap = a[j];a[j] = a[j-h];a[j-h] = swap;exch4++;}else{break;}}}h /= 3;}}public static void main(String[] args) {Random random = new Random();int[] arg = new int[10000];for(int n=0;n<10000;n++){ //從[0-10000]中生成10000個隨機數arg[n] = random.nextInt(10000);}int[] arg1 = new int[arg.length];int[] arg2 = new int[arg.length];int[] arg3 = new int[arg.length];int[] arg4 = new int[arg.length];for(int n=0;n<arg.length;n++){ //將隨機生成的數組復制到4個數組中arg1[n] = arg[n];arg2[n] = arg[n];arg3[n] = arg[n];arg4[n] = arg[n];}//分別對4個元素相等的數組用4個不同增量排序long startTime1 = System.currentTimeMillis(); //獲取開始時間 sort1(arg1);long endTime1 = System.currentTimeMillis(); //獲取結束時間long startTime2 = System.currentTimeMillis(); //獲取開始時間 sort2(arg2);long endTime2 = System.currentTimeMillis(); //獲取結束時間long startTime3 = System.currentTimeMillis(); //獲取開始時間 sort3(arg3);long endTime3 = System.currentTimeMillis(); //獲取結束時間long startTime4 = System.currentTimeMillis(); //獲取開始時間 sort4(arg4);long endTime4 = System.currentTimeMillis(); //獲取結束時間System.out.println("數組長度:"+arg.length);System.out.println("增量h=N/2的比較次數: "+comp1+" 交換次數:"+exch1+" 排序時長:"+(endTime1-startTime1)+"ms");System.out.println("增量h=N/3的比較次數: "+comp2+" 交換次數:"+exch2+" 排序時長:"+(endTime2-startTime2)+"ms");System.out.println("增量h=2?-1的比較次數: "+comp3+" 交換次數:"+exch3+" 排序時長:"+(endTime3-startTime3)+"ms");System.out.println("增量h=(3?-1)/2的比較次數:"+comp4+" 交換次數:"+exch4+" 排序時長:"+(endTime4-startTime4)+"ms");} }

? ? ? ? ?執行結果:

數組長度:10000 增量h=N/2的比較次數: 265465 交換次數:150579 排序時長:0ms 增量h=N/3的比較次數: 230360 交換次數:159712 排序時長:0ms 增量h=2?-1的比較次數: 238035 交換次數:129679 排序時長:15ms 增量h=(3?-1)/2的比較次數:227429 交換次數:156614 排序時長:0ms

?

? ? ? ? ?轉載請注明出處?http://www.cnblogs.com/Y-oung/p/7805984.html

? ? ? ??工作、學習、交流或有任何疑問,請聯系郵箱:yy1340128046@163.com

轉載于:https://www.cnblogs.com/Y-oung/p/7805984.html

總結

以上是生活随笔為你收集整理的希尔排序增量研究的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。