排序演算法(三)

2022-03-31 01:37:27 字數 1303 閱讀 1688

希爾排序是2023年由d.l.shell提出來的,相對直接排序有較大的改進。希爾排序又叫縮小增量排序。

基本思想:

基本思想:演算法先將要排序的一組數按某個增量d(n/2,n為要排序數的個數)分成若干組,每組中記錄的下標相差d.對每組中全部元素進行直接插入排序,然後再用乙個較小的增量(d/2)對它進行分組,在每組中再進行直接插入排序。當增量減到1時,進行直接插入排序後,排序完成。

操作方法:

1、選擇乙個增量序列t1,t2,....,tk,其中ti>tj,tk=1;

2、按增量序列的個數k,對序列進行k趟排序;

3、每趟排序,根據對應的增量ti,將帶排序列分割成若干長度為m的子串行,分別對個子序列進行直接插入排序。僅增量因子為1時,整個序列為乙個表來處理,表長度即為整個序列的長度。

希爾排序的示例:

演算法實現:

我們簡單處理增量序列:增量序列d =  n為要排序數的個數

即:先將要排序的一組記錄按某個增量d(n/2,n為要排序數的個數)分成若干組子串行,每組中記錄的下標相差d.對每組中全部元素進行直接插入排序,然後再用乙個較小的增量(d/2)對它進行分組,在每組中再進行直接插入排序。繼續不斷縮小增量直至為1,最後使用直接插入排序完成排序。

public

class

shellsort3 ;

system.out.println("排序前");

for(int i=0; i)

system.out.println();

shellsort(a, a.length);

system.out.println("排序後");

for(int i=0; i)

}public

static

void shellsort(int a,int

n) a[j+d] =x;

}d/=2;}}

}

希爾排序時效分析很難,關鍵碼的比較次數與記錄移動次數依賴於增量因子序列d的選取,特定情況下可以準確估算出關鍵碼的比較次數和記錄的移動次數。目前還沒有人給出選取最好的增量因子序列的方法。增量因子序列可以有各種取法,有取奇數的,也有取質數的,但需要注意:增量因子中除1 外沒有公因子,且最後乙個增量因子必須為1。希爾排序方法是乙個不穩定的排序方法。

排序演算法(三) 選擇排序演算法

選擇排序演算法首先從序列中選擇乙個元素arr i 通常是第乙個 作為當前最小值,然後把arr i 依次與序列中arr i 之後的元素作比較,如果有元素小於arr i 的,就讓它跟arr i 交換。然後再選擇arr i 1 作為下一輪比較的最小值,然後繼續比較.選擇排序演算法原理很簡單,就是每次把未排...

排序演算法(三)

6 歸併排序 原理 將兩個及以上的有序表合併成乙個有序表。將待排序列分成若干個序列,將各個小序列排成有序,最後合併將整個有序序列。基本思路,開始,將相鄰兩個元素合併成乙個有序序列,然後,相鄰兩個序列再合併成乙個有序序列,不斷迴圈,直到整個序列合併為乙個有序序列。示例如下 實現 public clas...

排序演算法(三)

對於輸入的資料x存入標記為x的陣列中,並統計x的個數。適用於資料範圍小,資料量大的情況。演算法的步驟如下 1.找出待排序的陣列中最大和最小的元素 2.統計陣列中每個值為i的元素出現的次數,存入陣列c的第i項 3.對所有的計數累加 從c中的第乙個元素開始,每一項和前一項相加 4.反向填充目標陣列 將每...