1. 程式人生 > >Java排序算法——快速排序

Java排序算法——快速排序

java排序 交換 快速排序 vat bsp 思想 log string code

基本思想

快速排序利用了分治法思想通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

基本過程

  1. 設置兩個變量i、j,排序開始的時候:i=0,j=N-1;
  2. 以第一個數組元素作為關鍵數據,賦值給key,即key=a[0];
  3. 從j開始向前搜索,即由後開始向前搜索(j--),找到第一個小於key的值A[j],將A[j]和A[i]互換;
  4. 從i開始向後搜索,即由前開始向後搜索(i++),找到第一個大於key的A[i],將A[i]和A[j]互換;
  5. 重復第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小於key,4中A[i]不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止)。

Java代碼

import java.util.Arrays;
public class QuickSort {
public static void sort(int[] arr, int low, int high) {
if (low < high) {
// 將數組一分為二
int mid = getMid(arr, low, high);
// 對低位的數組進行遞歸排序
sort(arr, low, mid - 1);
// 對高位的數組進行遞歸排序 sort(arr, mid + 1, high); } } private static int getMid(int[] arr, int low, int high) { // 將第一個數作為基準 int temp = arr[low]; while (low < high) { while (low < high && arr[high] > temp) { high--; } // 把比基準小的數移到低端 arr[low] = arr[high]; while (low < high && arr[low] < temp) { low
++; } // 把比基準大的數移到高端 arr[high] = arr[low]; } // 讓基準記錄到尾端 arr[low] = temp; // 返回基準的位置 return low; } public static void main(String[] args) { int[] arr = new int[] { 14, 12, 15, 13, 11, 16 }; sort(arr, 0, arr.length - 1); System.out.println(Arrays.toString(arr)); } }

算法分析

  1. 時間復雜度:快速排序最壞的時間復雜度為O(n^2),平均時間復雜度為O(nlogn)。
  2. 空間復雜度:O(n)。
  3. 穩定性:因為存在key和其他元素的交換,會打亂原來序列的排序。比如序列為 5 3 3 4 3 8 9 10 11, 現在key元素5和3(第5個元素,下標從1開始計)交換就會把元素3的穩定性打亂,所以快速排序是一個不穩定的排序算法,不穩定發生在key和a[j] 交換的時刻。

Java排序算法——快速排序