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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【大话数据结构算法】希尔排序

發(fā)布時間:2024/4/14 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【大话数据结构算法】希尔排序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

直接插入排序適合于序列基本有序的情況,希爾排序的每趟排序都會使整個序列變得更加有序,等整個序列基本有序了,再來一趟直接插入排序,這樣會使排序效率更高,這就是希爾排序的思想。


基本思想總結如下

先將整個待排元素序列分割 成若干個子序列(由相隔某個“增量” 的元素組成)分別進行直接插入排序, 然后依次縮減增量再進行排序,待整個 序列中的元素基本有序(增量足夠小) 時,再對全體元素進行一次直接插入排序。


希爾排序基本算法實現(xiàn)如下:

void shellSort(int[] a, int n){int i,j,gap;//步長for (gap = n/2;gap > 0;gap /= 2) {//直接插入排序for(i = 0;i < gap;i++){for(j = i + gap;j < n; j += gap){//對一個小序列中的元素進行比較排序if(a[j] < a[j - gap]){int temp = a[j];int k = j - gap;while(k >= 0 && a[k] > temp){a[k + gap] = a[k];k -= gap;}a[k + gap] = temp;}}}} }

java代碼實現(xiàn)如下:

public class ShellSort {public static void main(String[] args) {int[] a = {9,4,2,1,5,0,6,7};shellSort1(a, 8);for (int i = 0; i < a.length; i++) {System. out.println(a[i]);}System. out.println("***********" );shellSort2(a, 8);for (int i = 0; i < a.length; i++) {System. out.println(a[i]);}System. out.println("***********" );shellSort3(a, 8);for (int i = 0; i < a.length; i++) {System. out.println(a[i]);}}//嚴格按定義實現(xiàn)的希爾排序public static void shellSort1(int[] a, int n){int i,j,gap;//步長for (gap = n/2;gap > 0;gap /= 2) {//直接插入排序for(i = 0;i < gap;i++){for(j = i + gap;j < n; j += gap){//對一個小序列中的元素進行比較排序if(a[j] < a[j - gap]){int temp = a[j];int k = j - gap;while(k >= 0 && a[k] > temp){a[k + gap] = a[k];k -= gap;}a[k + gap] = temp;}}}}}/*** 優(yōu)化:以第二次排序為例,原來是每次從1A到1E,從2A到2E,可以改成從1B開始,先和1A比較,* 然后取2B與2A比較,再取1C與前面自己組內(nèi)的數(shù)據(jù)比較…….。這種每次從數(shù)組第gap個元素開始,* 每個元素與自己組內(nèi)的數(shù)據(jù)進行直接插入排序顯然也是正確的。** @param a* @param n*/public static void shellSort2(int[] a, int n){int j,gap;//步長for(gap = n / 2;gap > 0;gap /= 2){//數(shù)組從第gap個元素開始for(j = gap;j < n; j++){//每個元素與自己組內(nèi)的元素進行直接插入排序if(a[j] < a[j - gap]){int temp = a[j];//交換a[j]和a[j-gap]的位置while(j - gap >= 0 && a[j - gap] > temp){a[j] = a[j - gap];}a[j - gap] = temp;}}}}/*** 優(yōu)化:將以上優(yōu)化算法的直接插入排序部分用直接插入排序算法替代** @param a* @param n*/public static void shellSort3(int[] a, int n){int i,j,gap;//步長for(gap = n / 2;gap > 0;gap /= 2){//數(shù)組從第gap個元素開始for(i = gap;i < n;i++){//交換a[i-gap]和a[i]的位置for(j = i - gap;j >= 0 && a[j] > a[j + gap];j -= gap){int temp = a[j];a[ j] = a[j + gap];a[j + gap] = temp;}}}}}

時間復雜度

希爾排序的平均時間復雜度為O(nlogn){以2為底}


空間復雜度

希爾排序的空間復雜度同直接插入排序一樣為O(1)


注意:希爾排序的增量取法需要注意的一點就是,首先增量序列的最后一個值一定是1;其次增量序列中的值沒有除1之外的公因子,如8,4,2,1這樣的序列就不要取,因為8,4,2有公因子2。

總結

以上是生活随笔為你收集整理的【大话数据结构算法】希尔排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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