Java實現經典排序演算法及複雜度穩定性分析
阿新 • • 發佈:2019-02-16
/* 氣泡排序 */ public static int[] bubbleSort(int[] arry) { for (int i = 0; i < arry.length; i++) { for (int j = i; j < arry.length - i - 1; j++) { if (arry[j] > arry[j + 1]) { int temp = arry[j]; arry[j] = arry[j + 1];// 交換順序,大的在後,小的在前 arry[j + 1] = temp; } } } return arry; }
/* 插入排序 */ /* * 基本思想:每步將一個待排序的記錄,按其順序碼大小插入到前面已經排序的字序列的合適位置(從後向前找到合適位置後) * 直到全部插入排序完為止。(類似於撲克牌抓牌) */ public static int[] insertSort(int[] arry) { // 從陣列第二位開始,第一位為初始排好的順序 for (int i = 1; i < arry.length; i++) { int temp = arry[i];// 儲存待插入的數值 int j = i - 1;// 當前數值的前一位陣列角標 for (j = i - 1; j >= 0; j--) { if (arry[j] > temp) { arry[j + 1] = arry[j];// 將前一位數值移動一位(內部迴圈比較找到要最後要插入的位置) } else { break; } } arry[j + 1] = temp;// 將待插入的數值插入合適的位置 } return arry; }
/* 簡單選擇排序 */ /* * 基本思想:在要排序的一組數中,選出最小的一個數與第一個位置的數交換; * 然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後一個數比較為止。 */ public static int[] choiceSort(int[] arry) { for (int i = 0; i < arry.length; i++) { int low = i; for (int j = i + 1; j < arry.length; j++) { if (arry[j] < arry[low]) { low = j;// 尋找最小數值位置 } } // 將當前第一個元素與它後面序列中的最小的一個 元素交換,也就是將最小的元素放在最前端 int temp = arry[i]; arry[i] = arry[low]; arry[low] = temp; } return arry; }
/* 快速排序 */
/*
* 基本思想:選擇一個基準元素,通常選擇第一個元素或者最後一個元素, 通過一趟掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大於等於基準元素,
* 此時基準元素在其排好序後的正確位置,然後再用同樣的方法遞迴地排序劃分的兩部分。
*
* 一趟快速排序的演算法是:
1)設定兩個變數i、j,排序開始的時候:i=0,j=N-1;
2)以第一個陣列元素作為關鍵資料,賦值給key,即key=A[0];
3)從j開始向前搜尋,即由後開始向前搜尋(j--),找到第一個小於key的值A[j],將A[j]和A[i]互換;
4)從i開始向後搜尋,即由前開始向後搜尋(i++),找到第一個大於key的A[i],將A[i]和A[j]互換;
5)重複第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小於key,4中A[i]
不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進行
交換的時候i, j指標位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令迴圈結束)。
*/
public static int[] quickSort(int[] arry, int low, int high) {
if (low < high) {
int middle = getMiddle(arry, low, high);
quickSort(arry, 0, middle - 1);//遞迴快排左邊這個部分
quickSort(arry, middle + 1, high);//遞迴快排右邊這個部分
}
return arry;
}
private static int getMiddle(int[] arry, int low, int high) {
int temp = arry[low];// 基準元素
while (low < high) {
while (low < high && arry[high] >= temp) {
high--;//從最右邊往左找小於基準的元素
}
arry[low] = arry[high];//交換位置,小的在基準元素左邊
while (low < high && arry[low] <= temp) {
low++;//從基準元素的右邊找大於它的元素
}
arry[high] = arry[low];//交換位置,大的在基準元素右邊
}
//當low == high,完成一趟快速排序
arry[low] = temp;
return low;
}
平均時間複雜度比較:
冒泡:O(n^2)
插入:O(n^2)
選擇:O(n^2)
快排:O(nlgn)
穩定性:
冒泡:穩定
插入:穩定
選擇:不穩定
快排:不穩定
轉載自:http://blog.csdn.net/u013812939/article/details/46739923點選開啟連結