常見的排序演算法總結(JAVA實現)

2021-09-14 05:36:29 字數 3546 閱讀 2853

插入排序:直接插入排序、希爾排序。

選擇排序:直接選擇排序、堆排序。

交換排序:氣泡排序、快速排序。

歸併排序。

基數排序。

思路:對於一組資料,先將第乙個和第二個數排序,再將第三個數插入之前已經有序序列中形成新的有序序列,以此類推。也就是對於第n個數的排序,是將這第n個數插入到前n-1個數的有序序列中,從而得到乙個n個數的有序序列。

**實現:

public int insert_sort(int num)

num[j+1]=insertnum;

} return num;

}

效能分析:最好的情況:原來陣列已經有序,複雜度為o(n);

最壞的情況:原陣列為逆序,複雜度為

平均時間複雜度

穩定性:穩定

思路:希爾排序是針對直接插入排序中逆序情況下效率較低而改進而來的。假設資料的個數為n,選取加乙個奇數k=n/2,將下標之差為k的數分為一組進行簡單插入排序並構成有序序列,如比較下標為1和1+k的兩個資料。之後再去k=k/2,將下標差值為k的數分為一組進行簡單插入排序構成有序序列,重複進行直到k=1時,此時序列已經基本有序,再執行簡單插入排序時效率較高。但是在不同的排序中數會移動,因此是不穩定的。

**如下:

public static int shell_sort(int num)

while((a[i]<=base)&&ii)}}

效能分析:最好情況:o(nlog n)

最壞情況:o(n^2)

平均情況:o(nlog n)

空間複雜度:o(1)

穩定性:不穩定

思路:歸併排序也是基於遞迴和分治的思想,但是和快速排序有些許的不同。快速排序是利用基準將陣列劃分為兩部分,再在兩部分中分別遞迴;而歸併排序是先不斷利用二分將陣列化為多個最小部分,先在最小部分中實現有序,之後再進行回溯,將兩個最小單位合併成乙個有序的長度為2倍最小單位長度的陣列,依次類遞迴,直到遞迴到最初的位置便歸併為乙個有序的陣列。大體思想是先將陣列化為為多個小陣列,再通過歸併小陣列自下而上地排序。

實現過程

1.先申請乙個大小為兩個已排序的陣列長度之和的陣列,用於存放歸併後的序列

2.設定兩個指標,分別指向兩個已排序陣列的第乙個元素

3.比較兩個指標的元素的大小,較小的乙個值取出放入合併後的空間,並且將指標向後移動一位

4.重複第三步,直到某乙個指標都到陣列尾部

5.將另乙個陣列的所有剩下的元素複製到合併後的陣列中

參考**:

//歸併排序

public static void mergesort(int data)

public static void sort(int data, int left, int right)

// system.out.println(); }

/*** 將兩個陣列進行歸併,歸併前面2個陣列已有序,歸併後依然有序

*///data為陣列物件,left為左陣列的第乙個元素的索引,center為左陣列最後乙個元素的索引,

//center+1為右陣列的第乙個元素的索引,right為右陣列最後乙個元素的索引

public static void merge(int data, int left, int center, int right) else

} // 將另一陣列的剩餘部分依次放入臨時陣列,其實只會執行其中的乙個

while (mid <= right)

while (left <= center)

// 將臨時陣列中的內容拷貝回原陣列中

// (原left-right範圍的內容被複製回原陣列)

while (tmp <= right)

}

效能分析:

最佳情況

:o(nlog n)

最壞情況:o(nlog n)

平均情況:o(nlog n)

空間複雜度:o(n)

穩定性:不穩定

思路:基數排序不是一種傳統意義上的排序,而更像是一種排序的應用,基數排序的總體思路就是將待排序資料拆分成多個關鍵字進行排序,也就是說,基數排序的實質是多關鍵字排序。

多關鍵字排序將待排序的資料拆分成多個關鍵字後進行排序,根據子關鍵字對待排序資料進行排序。

多關鍵字排序有最高位優先和最低位優先兩種:

比如,我們對於 123,23,3進行排序,我們看到這些資料最高直到百位,因此我們可以選擇百位、十位、個位等三個關鍵字進行比較,先比較百位的大小,如果相同再比較十位,如果還相同再比較個位。這種為最高位優先,但是當我們開始比較十位的時候,程式還需要回頭去判斷百位是否會相同,這樣就比較麻煩,因此一般都採用最低位優先。

基數排序方法對任一子關鍵字排序時必須借助於另一種排序方法,而且這種排序方法必須是穩定的。但是如果有負數存在的話,會對演算法有較大的影響。

**實現:

private static void radixsort(int array,int d)

{ int n=1;//代表位數對應的數:1,10,100...

int k=0;//儲存每一位排序後的結果用於下一位的排序輸入

int length=array.length;

int bucket=new int[10][length];//排序桶用於儲存每次排序後的結果,這一位上排序結果相同的數字放在同乙個桶裡

int order=new int[length];//用於儲存每個桶裡有多少個數字

while(n演算法分析:

最好的情況:o(d(n+r))

最壞的情況:o(d(n+r))

平均時間複雜度:o(d(n+r))

空間複雜度:o(n+r)

穩定性:穩定

總而言之,不同的演算法有其不同的優點,具體採用哪種演算法需要具體問題具體分析。

常見的排序演算法 Java實現

最近在準備面試,回顧了一下之前學習的幾種排序演算法,並參考材料嘗試實現。現在此記錄一下,以後忘了可以回顧。直接貼上 有許多值得優化的地方 package hpp.sort created by hpp on 2017 8 4.public class sorttest insertsort arra...

常見排序演算法總結(java版)

總結幾種常用到的排序演算法,如下 1.選擇排序 2.插入排序 3.氣泡排序 4.歸併排序 5.快速排序 6.堆排序 為方便起見,規定陣列為整形陣列,並要按遞增排序,並定義幾個方法 private static void exch int a,int i,int j 1.選擇排序 選擇排序的思想就是 ...

排序演算法總結(java實現)

排序演算法的分類如下 1.插入排序 直接插入排序 折半插入排序 希爾排序 2.交換排序 冒泡泡排序 快速排序 3.選擇排序 直接選擇排序 堆排序 4.歸併排序 5.基數排序。關於排序方法的選擇 1 若n較小 如n 50 可採用直接插入或直接選擇排序。當記錄規模較小時,直接插入排序較好 否則因為直接選...