演算法學習——快速排序
阿新 • • 發佈:2019-01-08
看過了氣泡排序和選擇排序,昨天看了快速排序,對於其中的位置互換理解的有點混亂,直到今天才弄明白是怎麼一回事。過程大概瞭解了,利用了分治的思想,如果要對一個數組進行排序,先取陣列中的一個數作為基準數,遍歷陣列,將陣列中大於該基準數的數放在右邊,小於該基準數的數放在左邊,這樣就將較小的數和較大的數分成了兩個部分,基準數是最後確定位置的,並不是像插入排序一樣先確定基準數的位置,然後再將其它數進行排序。
一次排序進行之後,遞迴將基準數旁邊的兩部分再進行排序,以此類推,直到陣列中所有元素均有序為止。
package pp.suanfa; /** * 快速排序 * * @author xiaoGd * */ public class QuickSort { public static void sort(int[] array, int low, int high) { int i, j, index; if (low > high)// 如果元素的位置不合理,直接返回 return; i = low; j = high; index = array[i];// 挑選隨機基準數 while (i < j) { while (i < j && array[j] > index) // 若基準數後面的元素比基準數大,則位置不變,繼續向前比較 j--; if (i < j)// 若基準數後面的元素比基準數小,則將array[i]和array[j]互換位置,i++ array[i++] = array[j]; while (i < j && array[i] < index) // 若基準數前面的元素比基準數小,則位置不變,繼續向後比較 i++; if (i < j)// 若基準數前面的元素比基準數大,則將array[i]和array[j]互換位置,j-- array[j--] = array[i]; } array[i] = index;// 最後確定基準數的位置 sort(array, low, i - 1); sort(array, i + 1, high); } public static void quickSort(int array[]) { sort(array, 0, array.length - 1); } public static void main(String[] args) { int[] a = { 2, 0, 3, 5, 4, 8, 7, 6, 1, 9 }; quickSort(a); for (int i = 0; i < a.length; i++) { System.out.print(a[i] + " "); } } }
排序完成後:
快速排序最壞的時間複雜度為O(n²),最好及平均時間複雜度為O(nlogn).