6種內部排序演算法 Java實現

2021-07-25 11:44:34 字數 2823 閱讀 7569

一、直接插入排序

待排序陣列:a[0..n-1],

排序思路:首先我們認為a[0]是已經排好序的,在排序過程中,依次將a[i](i=1,2,...,n-1)從後往前插入到前面已經 排

好序的子陣列a[0..i-1]中的適當位置中,待所有的a[i]插入完畢,即排序完畢。

演算法如下:

空間上,該演算法僅需要常數個輔助單元,空間複雜度為o(1)

時間上,該演算法的主程式執行了n-1趟,顯然,記錄的初始排列對排序過程中記錄的比較次數和移動次數都 有影

響。 最好的情況下,即初始序列有序,則每次迴圈只需與前乙個記錄比較一次,且不需要移動,總的比較次 數為

n-1,移動次數為0;

最壞的情況下,即初始序列逆序,則每個記錄a[i]都需要與之前的子陣列中的所有記錄進行比較,總的比較

次數達到最大,總的移動次數也達到了最大。

所以,直接插入排序的時間複雜度為o(n^2),它是一種穩定的排序演算法。

二、折半插入排序

折半插入排序的基本原理與直接插入排序相同

不同之處:(1)確定當前記錄在前面有序子陣列中的位置時,直接插入排序是採用順序查詢法, 而折半插入排 序是

採用折半查詢法,(2)直接插入排序,邊比較邊移動元素,而折半插入排序則將比較和移動操作

分離,即先查詢出元素的待插入位置,然後再同意地移動帶插入位置之後的所有元素。

演算法如下:

相對於直接插入排序,折半插入排序演算法僅僅是減少了比較元素的次數,它的比較次數與初始序列無關,僅取決

於序列中的元素個數n

時間複雜度為o(n^2),為穩定排序演算法。

三、希爾排序

又稱為縮小增量排序,

基本思想:先將待排序序列分割成若干個字表,分別進行直接插入排序,待整個表中元素呈基本有序時,再對全

體記錄進行一次直接插入排序。

演算法如下:

希爾排序只需乙個記錄的輔助空間,它是一種不穩定的排序演算法。

四、氣泡排序

基本思想:假設待排序表長為n,從後向前/從前向後兩兩比較相鄰元素的值,若為逆序,則交換他們,直到序列

比較完成,這稱為一趟冒泡,結果將最小的元素交換到待排序列的第乙個位置,下一趟排序時,則前

面一趟確定的最

小原序不再參與比較,待排序列減少乙個元素,每趟冒泡的結果是將序列中的最小元

素放到了序列的最終位置

演算法如下:

時間複雜度為o(n^2),它僅使用了常數個輔助單元,空間複雜度為o(1),為穩定的排序演算法

五、快速排序

快速排序是在氣泡排序的基礎上改進而來的,它是基於分治的思想。下面對乙個典型子陣列a[left...right]排序的

分治過程的三個步驟:

分解:陣列a[left...right]被劃分為兩個子陣列a[left...q-1]和a[q+1...right],使得a[left...q-1]中的每個元素都小於等

於a[q],a[q+1...right]中的每個元素都大於等於a[q];

解決:通過遞迴呼叫快速排序,對子陣列a[left...q-1]和

a[q+1...right]排序;

合併:由於兩個子陣列均是在原地進行排序的,故此時已經得到有序的序列了。

演算法如下:

快速排序的執行效率與劃分對稱有關。

最壞的情況:在兩個分割槽,分別包含n-1個和0個元素,這種最大程度的不對稱性若發生在每一層遞迴上,就得到

時間複雜度為o(n^2);因此快速排序在最壞情況下並不比插入排序號。此外,當輸入陣列已經是完全排好序時,快速

排序的執行時間也為o(n^2)。同樣情況下, 插入排序的執行時間為o(n);

最理想的情況:也就是分割槽做到最平衡的劃分,得到的兩個子陣列的大小都不可能》n/2.這種情況下,快速排序

的執行速度將大大的提公升。時間複雜度o(nlog2n

) 由於快速排序是遞迴的,所以需要乙個棧來存放每一層遞迴呼叫的必要資訊,其最大容量與遞迴電泳的深度一

致。最好情況下為

棧的深度為

o(log2n

);最壞情況下,需進行n-1次遞迴呼叫,棧的深度為o(n);平均情況下,棧深 為

o(log2n

)。 快速排序是一種不穩定的排序方法。

六、選擇排序

排序思想:每一趟(如第i趟)在後面n-i+1個待排序元素中選取關鍵字最小的元素,最為有序序列的第i個元素,

共需進行n-1趟。

演算法如下:

整個排序過程供需選擇n-1次,第i趟選擇最小元素所比較的次數為n-i次,與初始序列無關,因此,總的比較次數

為n(n-1)/2

若初始序列有序,則整個排序過程中的元素移動次數為0,相反,逆序情況下,則每個元素都需要進行1次交換、

3次移動,元素移動的總次數為3(n-1)

選擇排序的時間複雜度為o(n^2),為不穩定排序。

java實現6種排序演算法

典型的二分查詢 對於二分查詢演算法要求,查詢前的資料必須是已經排好序的,然後得到陣列的開始位置start和結束位置end,取中間位置mid的資料a mid 跟待查詢資料key進行比較,若 a mid key,則取end mid 1 若 a mid key,則取start mid 1 若 a mid ...

JAVA基礎 6種常用排序演算法

各種排序的時間 空間複雜度 穩定性是指排序中 相同的數在排序前後,他們的 相對位置不會發生改變。1.直接插入排序 經常碰到這樣一類排序問題 把新的資料插入到已經排好的資料列中。將第乙個數和第二個數排序,然後構成乙個有序序列 將第三個數插入進去,構成乙個新的有序序列。對第四個數 第五個數 直到最後乙個...

八種排序演算法 Java實現

基本思想 在要排序的一組數中,選出最小的乙個數與第乙個位置的數交換 然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後乙個數比較為止。實現 public class selectsort selectsort a for int i 0 i public static v...