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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[算法]-排序算法之希尔排序

發(fā)布時(shí)間:2023/11/29 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [算法]-排序算法之希尔排序 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

希爾排序算法思想

  • 希爾排序的實(shí)質(zhì)就是分組插入排序,該方法又稱縮小增量排序.

  • 基本思想是:先將整個(gè)待排元素序列分割成若干個(gè)子序列(由相隔某個(gè)“增量”的元素組成的)分別進(jìn)行直接插入排序,然后依次縮減增量再進(jìn)行排序,待整個(gè)序列中的元素基本有序(增量足夠小)時(shí),再對(duì)全體元素進(jìn)行一次直接插入排序。因?yàn)橹苯硬迦肱判蛟谠鼗居行虻那闆r下(接近最好情況),效率是很高的,因此希爾排序在時(shí)間效率上比前兩種方法有較大提高。

代碼

要求

對(duì)于一個(gè)int數(shù)組,請(qǐng)編寫一個(gè)希爾排序算法,對(duì)數(shù)組元素排序。
給定一個(gè)int數(shù)組A及數(shù)組的大小n,請(qǐng)返回排序后的數(shù)組。保證元素小于等于2000。

測(cè)試樣例:

[1,2,3,5,2,3],6
[1,2,2,3,3,5]

程序一(好理解,但是比較麻煩)

class ShellSort { public:int* shellSort(int* A, int n) {// write code hereif(n<2){return A;}int count = 2, argument; //count:一個(gè)子序列中的元素?cái)?shù),argument:增量,也是子序列的數(shù)量while(count<=n){argument = n/count;for(int i=0;i<argument;i++){sortArgu(A,n,i,argument); //這里把一次插入排序過(guò)程抽出來(lái)}count *=2;}return A;}private:void sortArgu(int* A, int n, int begin, int argu){int temp, last, current; //begin:子序列的起始元素current = begin+argu;// current: 一次插入排序中,當(dāng)前要排序的元素,也就是無(wú)序部分的第一個(gè)元素while(current<n){last = current;while(last-argu>=begin){if(A[last]<A[last-argu]){temp = A[last];A[last] = A[last-argu];A[last-argu] = temp;}last -= argu;}current +=argu;}} };

程序二

class ShellSort { public:int* shellSort(int* A, int n) {// write code hereif(n<2){return A;}int temp,j;for(int step=n/2; step>0; step/=2){ //這里控制增量,最小值時(shí)為1,也就是一次普通的插入排序for(int i=step; i<n; i++){ //重點(diǎn)是在這里!!!這里是對(duì)第一個(gè)增量后的元素進(jìn)行插入排序(插入排序時(shí)起始有序序列為1),沒有把一個(gè)子序列單獨(dú)抽出來(lái)進(jìn)行排序(區(qū)別程序一),而是依次對(duì)第一個(gè)增量后的元素在其所屬的子序列中進(jìn)行插入排序for(j=i; j>=step; j-=step){if(A[j]<A[j-step]){temp = A[j]; //這里還可以進(jìn)一步優(yōu)化,詳見程序三A[j] = A[j-step];A[j-step] = temp;}else{break;}}} }return A;}};

程序三

class ShellSort { public:int* shellSort(int* A, int n) {// write code hereif(n<2){return A;}int temp,j;for(int step=n/2; step>0; step/=2){for(int i=step; i<n; i++){ //思想:找到待排序元素在有序部分的位置,然后插入,而不是每一次都把待排序元素與前一個(gè)元素交換位置。temp = A[i]; //記錄下待排序元素for(j=i; j>=step; j-=step){if(temp<A[j-step]){ //有序部分的每一個(gè)元素都與待排序元素比較A[j]=A[j-step]; //滿足上述條件,則元素后移}else{break;}}A[j]=temp; //將待排序元素插入合適位置} }return A;}};

參考

1 白話經(jīng)典算法系列之三 希爾排序的實(shí)現(xiàn)

總結(jié)

以上是生活随笔為你收集整理的[算法]-排序算法之希尔排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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