日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

希尔排序增量研究

發(fā)布時(shí)間:2025/3/21 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 希尔排序增量研究 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

? ? ? ? 本篇使用四組不同的增量,通過(guò)統(tǒng)計(jì)排序的比較次數(shù)、移動(dòng)次數(shù)、執(zhí)行時(shí)間,來(lái)討論不同的增量對(duì)希爾排序效率的影響。

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

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

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

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

? ? ? ? 1、保持序列元素個(gè)數(shù)不變

? ? ? ? 保持序列元素個(gè)數(shù)為1000000,每次隨機(jī)生成不同的序列,對(duì)四個(gè)增量分別做4組排序。

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

? ? ? ??從測(cè)試的結(jié)果來(lái)看,當(dāng)序列元素個(gè)數(shù)相同時(shí),對(duì)四種增量分別用生成的四組隨機(jī)數(shù)排序時(shí),它們的比較次數(shù)、移動(dòng)次數(shù)以及執(zhí)行時(shí)間等參數(shù)差別不大。因此可以認(rèn)為對(duì)于待排序列的元素個(gè)數(shù)相同的情況下,基于以上四種增量的序列,希爾排序算法的時(shí)間復(fù)雜度差異不是很明顯,執(zhí)行效率差別不大。

? ? ? ? 2、序列的元素個(gè)數(shù)改變

? ? ? ? 使序列元素個(gè)數(shù)增加,分別取10000、100000、1000000、10000000,每次隨機(jī)生成不同的序列,對(duì)四個(gè)增量分別排序。

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

? ? ? ? 從測(cè)試結(jié)果可以看出,不同長(zhǎng)度的序列使用四個(gè)增量分別進(jìn)行排序時(shí),比較次數(shù)、移動(dòng)次數(shù)、排序時(shí)長(zhǎng)有一定差異。當(dāng)元素個(gè)數(shù)較少時(shí),增量為h2=N/3, N/9, N/27,……,1的希爾排序效率比其他增量略高;

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

? ? ? ? 綜上所述,希爾排序算法在不同增量下的執(zhí)行效率也不盡相同,增量是影響希爾排序效率的重要因素。遺憾的是,雖然有很多論文專門研究過(guò)不同的增量對(duì)希爾排序的影響,但都無(wú)法證明某個(gè)增量是最好的。因此在使用希爾排序時(shí),根據(jù)排序序列的大小,選取適當(dāng)?shù)脑隽繉?duì)提高排序效率很有幫助。

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

import java.util.Random;/** 希爾排序*/public class ShellSort {//增量h=N/2static long comp1 = 0; //比較次數(shù)static long exch1 = 0; //交換次數(shù)public static void sort1(int[] a) {int n = a.length; //序列長(zhǎng)度int h = n/2; //初始增量h為序列長(zhǎng)度的一半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; //比較次數(shù)static long exch2 = 0; //交換次數(shù)public static void sort2(int[] a) {int n = a.length; //序列長(zhǎng)度int h = n/3; //初始增量h為序列長(zhǎng)度的三分之一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; //比較次數(shù)static long exch3 = 0; //交換次數(shù)public static void sort3(int[] a) {int n = a.length; //序列長(zhǎng)度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; //比較次數(shù)static long exch4 = 0; //交換次數(shù)public static void sort4(int[] a) {int n = a.length; //序列長(zhǎng)度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個(gè)隨機(jī)數(shù)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++){ //將隨機(jī)生成的數(shù)組復(fù)制到4個(gè)數(shù)組中arg1[n] = arg[n];arg2[n] = arg[n];arg3[n] = arg[n];arg4[n] = arg[n];}//分別對(duì)4個(gè)元素相等的數(shù)組用4個(gè)不同增量排序long startTime1 = System.currentTimeMillis(); //獲取開(kāi)始時(shí)間 sort1(arg1);long endTime1 = System.currentTimeMillis(); //獲取結(jié)束時(shí)間long startTime2 = System.currentTimeMillis(); //獲取開(kāi)始時(shí)間 sort2(arg2);long endTime2 = System.currentTimeMillis(); //獲取結(jié)束時(shí)間long startTime3 = System.currentTimeMillis(); //獲取開(kāi)始時(shí)間 sort3(arg3);long endTime3 = System.currentTimeMillis(); //獲取結(jié)束時(shí)間long startTime4 = System.currentTimeMillis(); //獲取開(kāi)始時(shí)間 sort4(arg4);long endTime4 = System.currentTimeMillis(); //獲取結(jié)束時(shí)間System.out.println("數(shù)組長(zhǎng)度:"+arg.length);System.out.println("增量h=N/2的比較次數(shù): "+comp1+" 交換次數(shù):"+exch1+" 排序時(shí)長(zhǎng):"+(endTime1-startTime1)+"ms");System.out.println("增量h=N/3的比較次數(shù): "+comp2+" 交換次數(shù):"+exch2+" 排序時(shí)長(zhǎng):"+(endTime2-startTime2)+"ms");System.out.println("增量h=2?-1的比較次數(shù): "+comp3+" 交換次數(shù):"+exch3+" 排序時(shí)長(zhǎng):"+(endTime3-startTime3)+"ms");System.out.println("增量h=(3?-1)/2的比較次數(shù):"+comp4+" 交換次數(shù):"+exch4+" 排序時(shí)長(zhǎng):"+(endTime4-startTime4)+"ms");} }

? ? ? ? ?執(zhí)行結(jié)果:

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

?

? ? ? ? ?轉(zhuǎn)載請(qǐng)注明出處?http://www.cnblogs.com/Y-oung/p/7805984.html

? ? ? ??工作、學(xué)習(xí)、交流或有任何疑問(wèn),請(qǐng)聯(lián)系郵箱:yy1340128046@163.com

轉(zhuǎn)載于:https://www.cnblogs.com/Y-oung/p/7805984.html

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。