氣泡排序和快速排序(java實現)
阿新 • • 發佈:2018-11-01
氣泡排序 Bubble Sort
在基於 “交換” 進行排序的方法中,氣泡排序是比較簡單的一種。
/**
* 氣泡排序
* 時間複雜度為O(n^2),空間複雜度為O(1)
*/
public static int[] bubbleSort(int[] array){
boolean change = true;
for (int i = array.length-1; i >= 1 && change; --i) {
change = false;
for (int j = 0; j < i; ++j) {
if (array[j] > array[j+1]) {
int t = array[j];
array[j] = array[j+1];
array[j+1] = t;
change = true;
}
}
}
return array;
}
大部分見到的氣泡排序是沒有 change 變數的。change 變數的作用是,在序列初始有序或基本有序時可以減少比較的次數,還是有存在的必要的。
快速排序 Quick Sort
快速排序是對氣泡排序的一種改進。快速排序的平均時間複雜度為O(nlog n)
,最壞情況下為O(n2)
。所謂最壞情況,即原始順序為逆序。
/**
* 快速排序,是對氣泡排序的改進。
* 平均時間複雜度為O(nlog n),最壞情況下為O(n^2)
*/
public static int partition(int []array,int low,int hight){
int pivot = array[low];
while(low < hight) {
while (low < hight && array[hight] >= pivot) hight--;
array [low] = array[hight];
while (low < hight && array[low] <= pivot) low++;
array[hight] = array[low];
}
array[low] = pivot;
return low;
}
public static void QSort(int []array,int low,int hight) {
if (low < hight) {
int pivotIndex = partition(array, low, hight);
QSort(array, low, pivotIndex-1);
QSort(array, pivotIndex+1, hight);
}
}
public static void quickSort(int []array) {
QSort(array,0,array.length-1);
}
快速排序的核心思想是,經過一趟排序後將待排序列分為兩個部分,其中一部分的值都要大於另一部分。然後分別將每部分再次排序,一直到整個序列有序。
partition 方法代表的是一趟排序。首先要確定一個支點 pivot ,一般可以取序列的第一個值。然後從序列的兩端取值與支點比較,將大於支點的值放一端,小於的放另一端。
迴圈直至 low = hight ,此時序列被分為兩部分,pivot 就處於當前 low/hight 的位置。返回支點的下標。
QSort 方法是遞迴呼叫 partition 方法,目的是分別對每個序列再次排序。
更多面試常見演算法問題 歡迎 Star !