排序演算法(三)——快速排序
阿新 • • 發佈:2019-01-08
快速排序(英語:Quicksort),簡稱快排,一種排序演算法。在平均狀況下,排序個專案要次比較。在最壞狀況下則需要次比較。
運作方式如下:
1.從陣列中挑出一個元素,作為基準,一般是第一個元素。
2.重新排序數列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面(相同的數可以到任何一邊)。在這個分割結束之後,該基準就處於數列的中間位置。
3.遞迴的把小於基準值元素的子數列和大於基準值元素的子數列排序。
4.直到遞迴到最底部時,數列的大小是零或一,也就是已經排序好了。
快速排序的平均時間複雜度也是:O(nlogn)
package cn.kimtian.sort; import java.util.Arrays; /** * 這是以一個快速排序演算法 * * @author kimtian */ public class QuickSort { public static void main(String[] args) { int[] arr = new int[]{3, 4, 6, 7, 2, 7, 2, 8, 0}; int[] arr1 = new int[]{7, 7, 6, 8, 4}; System.out.println(Arrays.toString(arr1)); quickSort(arr1, 0, arr1.length - 1); } /** * 快速排序 * {3, 4, 6, 7, 2, 7, 2, 8, 0} * 第一輪:{0, 2, 2, 3, 7, 7, 6, 8, 4} * 第二輪:{0, 2, 2, 3, 7, 7, 6, 8, 4} * 第三輪:{0, 2, 2, 3, 7, 7, 6, 8, 4} * 第四輪:{0, 2, 2, 3, 4, 6, 7, 7, 8} * 第五輪:{0, 2, 2, 3, 4, 6, 7, 7, 8} * 第六輪:{0, 2, 2, 3, 4, 6, 7, 7, 8} * 第七輪:{0, 2, 2, 3, 4, 6, 7, 7, 8} * * @param arr 需要排序的陣列 */ public static void quickSort(int[] arr, int start, int end) { System.out.println(Arrays.toString(arr)); //開始和結束標記中間一定要有元素 if (start < end) { //先找到一個標準數,一般採用陣列開始的數 int stard = arr[start]; //記錄需要排序的下標 int low = start; int high = end; //迴圈找比標準數大的數和比標準數小的數 while (low < high) { //右邊數比標註數大,直接向前移動 while (low < high && stard <= arr[high]) { high--; } //使用右邊的數字替換左邊的數字 arr[low] = arr[high]; //左邊數比標註數小,直接向前移動 while (low < high && arr[low] <= stard) { low++; } arr[high] = arr[low]; } //把標準數賦給重合位置所在的元素 arr[low] = stard; //處理所有小的數字 quickSort(arr, start, low); //處理所有大的數字 quickSort(arr, low + 1, end); } } }