前言
說實話還是爲了準備(可能有的)面試,哈哈,先把常用的總結一下。我想的是這樣:排序算法應該要經常手撕,所以可以在markdown編輯狀態下經常寫,然後和文章裏的對一下,這樣效果可能比較好。
1.複雜度,穩定性總結
注意:一般來說最好和最快問的少
二.代碼實現
冒泡排序:
-
介紹:一種簡單的排序算法,其方法是:首先將第一個關鍵字與第二個關鍵字進行比較,若逆序,則交換位置;然後比較第二個與第三個關鍵字,依次進行比較,直到第n-1個關鍵字和第n的關鍵字完成比較爲止。上述過程是第一趟冒泡,結果就是值最大的關鍵字排在了最後面。然後對前n-1個關鍵字進行第二趟冒泡,如此往復,直到整個序列有序爲止。
-
優化:很明顯,若果某一趟冒泡過程中沒有發生元素位置交換,那麼此時整個序列已經是有序的,無需繼續下面的操作。
public static void bubbleSort(int[] array) {
int len = array.length;
for (int i = 0; i < len; i++) {
for (int j = 0; j < len - i - 1; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j + 1];
array[j + 1] = array[j];
array[j] = temp;
}
}
}
}
快速排序:
- 介紹:快速排序是對冒泡排序的一種改進,它的基本思想如下:通過一趟排序將序列分割成兩部分,其中一部分的關鍵字均大於另一部分,則可以分別對兩部分進行排序,從而使整個序列有序。
- 步驟:首先選擇一個關鍵字作爲樞紐(通常爲第一個元素的關鍵字),然後讓所有關鍵字比樞紐小元素放在樞紐前面,比樞紐大的元素放在樞紐後面。這樣就根據樞紐最後落在的位置將序列分割成爲了兩部分。然後進行遞歸運算,就可以對數列進行排序。
public static void quickSort(int[] array, int left, int right) {
if (left < right) {
int pivot = array[left];
int l = left;
int r = right;
while (l < r) {
while (l < r && array[r] >= pivot) {
r--;
}
array[l] = array[r];
while (l < r && array[l] <= pivot) {
l++;
}
array[r] = array[l];
}
array[l] = pivot;
quickSort(array, left, l - 1);
quickSort(array, l + 1, right);
}
}