排序操作在計算機程式設計中分為外部排序和內部排序。我們一般所說的排序演算法指的就是內部排序,即資料記錄在計算機記憶體中進行排序。
上圖為內部排序的腦圖。下來九種排序演算法我們一一介紹。
1、氣泡排序
(1)基本思想:
假設 n 個數進行排序,則需要比較 n - 1 輪,第一輪比較 n - 1 次,之後每輪比較減少 1 次。 (2)**實現:第乙個版本:
public static void bubblesort(int a)
} }}
第一版本存在這樣的問題:假設一陣列長度為 6 ,故需要比較 5 輪,但會發現在第 4 輪就已完成,第 5 輪比較就沒有意義了,所以還能繼續優化。設定乙個boolean 變數 flag ,判斷某輪比較中是否發生資料交換。若沒有發生則表示排序完成,就可以立即停止。
第二個版本:
public static void bubblesort(int a)
}if(!flag) break;//如果為false則排序完成,跳出外層迴圈}}
(3)演算法分析:
最壞時間複雜度:o(n^2) 最好時間複雜度:o(n) 故平均複雜度為:o(n^2)穩定性:演算法是比較相鄰兩個元數,交換也發生在這兩個元數上,兩個相鄰元數值相等不會交換,排序前排序後相等的兩個元數的相對順序不會發生改變,故演算法具有穩定性。2、快速排序(1)基本思想:(利用了遞迴與分治策略的思想)
一輪快排具體操作是:i 和 j 開始分別置於陣列的最左端和最右端,設某個數為基準(一般取第 0 個數)。首先 j 先向左移動找到第乙個小於「基準」的數並和基準相互交換,然後 i 向右移動找到第乙個大於「基準」的數並和基準交換;重複這兩步直到 i == j 。
其實實際排序中沒有必要找到符合要求的數就和「基準」進行交換,因為只需要在i == j 的位置才是最後基準的位置,所以現在現將 基準暫存在 a [0] 位上,j 和 i 各自移動,找到符合條件(比基準小 / 大)的數,直到一輪排序結束再將基準移動到正確位置。
(2)**實現:
public static void quicksort(int a,int left,int right)
while(i < j && a [i] < pivotkey)// i 從左向右找第乙個大於基準的值
i++;
if(i < j)
}a [i] = pivotkey;// i== j 時將基準放置 i 處
quicksort(a,left,i - 1);//遞迴呼叫
quicksort(a,i + 1,right);
}
(3)演算法分析:
最壞時間複雜度:o(n^2) 最好時間複雜度:o(n logn) 故平均複雜度為:o(n logn)
穩定性:陣列 基準元素為 5 ,和第四個元素 2 交換,兩個 2 的相對順序發生改變,故演算法不穩定。
3、簡單選擇排序
(1)基本思想:
如圖示例:陣列長度為 8,需要比較 7 輪,第一輪需要比較 7 次,之後每輪比較次數減 1。
(2)**實現:
public static void selectsort(int a) 一次選擇的最小元素的值為 3 ,然後和第乙個 4 交換,兩個 4 的相對位置發生變化,故該演算法不穩定。4、堆排序堆的定義:n 個元素的序列 當且僅當滿足以下關係:大頂堆完全二叉樹: 小頂堆完全二叉樹:
ki <= k2i ki >= k2i
ki <= k2i+1 ki >= k2i+1(i = 1,2,3,……,n/2)
示例:
(1)基本思想:
(2)**實現:
// 堆排序
public static void heapsort(int a)
// 2.調整堆結構+交換堆頂元素與末尾元素
for (int j = a.length - 1; j > 0; j--)
}public static void adjustheap(int a, int i, int length)
if (a[k] > temp) else
}a[i] = temp;// 將temp值放到最終的位置
}
(3)演算法分析:
初始化堆為 o(n) ,交換堆元素並重建堆為 o(n logn) ,其時間複雜度最壞/最好/平均都是 o(n logn)
空間複雜度為 o( 1 )
參考文章:
幾種常見的排序演算法總結
所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。排序演算法,就是如何使得記錄按照要求排列的方法。排序演算法在很多領域得到相當地重視,尤其是在大量資料的處理方面。乙個優秀的演算法可以節省大量的資源。在各個領域中考慮到資料的各種限制和規範,要得到乙個符合實際的優秀...
java中幾種常見的排序演算法
本人只研究過氣泡排序 選擇排序和快速排序,下面是快速排序的 一 冒泡 bubble 排序 氣泡排序 bubblesort 的基本思想是 依次比較相鄰的兩個數,將小數放在前面,大數放在後面。如此重複下去,直至最終完成排序。時間複雜度為 o n n 適用於排序小列表。void bubblesortarr...
java實現常見的幾種排序演算法
public static void selectsort int array if i min public static void bubble int array if flag false public static void insertsort int numbers numbers j...