1. 程式人生 > 實用技巧 >排序演算法-快速排序

排序演算法-快速排序

快速排序是一種分治排序演算法,它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

1.程式碼實現

以java實現為例:

public class QuickSort {
    public static int[] quickSort(int[] nums,int start,int end) {
        int pivot = nums[start];
        int i = start;
        int
j = end; while (i < j) { while (i < j && nums[j] > pivot) {//此處不能用大於等於(下面同理),否則當首位為最大值時會無法交換 j--; } while (i < j && nums[i] < pivot) { i++; } if (nums[i] == nums[j] && i < j) {//
這一步是處理示例序列中這種情況 i++; } else { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } } if (i-1 > start) nums = quickSort(nums,start,i-1); if (j+1 < end) nums = quickSort(nums,j+1,end);
return nums; } public static void main(String[] args) { // int[] nums = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 10 }; int[] nums = new int[] { 10, 8, 7, 6, 5, 4, 3, 2, 10 }; int[] newNums = quickSort(nums,0,nums.length-1); for (int x : newNums) { System.out.print(x+" "); } } }

2.資料執行解析

資料的分解示例如下:

[10 8 7 6 5 4 3 2 10]
->[10 8 7 6 5 4 3 2 10]  第一次以下標為0的元素10開始比較,序列不變,此時i=j=8
->[2 8 7 6 5 4 3 10 10]  然後進入遞迴0-7之間序列排序,交換10和2,此時i=j=7
->[2 8 7 6 5 4 3 10 10]  然後進入遞迴0-6之間序列排序....
.....

3.複雜度分析

快速排序的最差時間複雜度是O(n²),平均時間複雜度是O(nlogn),空間複雜度為T(nlogn)。