Java排序算法——快速排序
阿新 • • 發佈:2019-05-08
java排序 交換 快速排序 vat bsp 思想 log string code
基本思想
快速排序利用了分治法思想。通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
基本過程
- 設置兩個變量i、j,排序開始的時候:i=0,j=N-1;
- 以第一個數組元素作為關鍵數據,賦值給key,即key=a[0];
- 從j開始向前搜索,即由後開始向前搜索(j--),找到第一個小於key的值A[j],將A[j]和A[i]互換;
- 從i開始向後搜索,即由前開始向後搜索(i++),找到第一個大於key的A[i],將A[i]和A[j]互換;
- 重復第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)); } }
算法分析
- 時間復雜度:快速排序最壞的時間復雜度為O(n^2),平均時間復雜度為O(nlogn)。
- 空間復雜度:O(n)。
- 穩定性:因為存在key和其他元素的交換,會打亂原來序列的排序。比如序列為 5 3 3 4 3 8 9 10 11, 現在key元素5和3(第5個元素,下標從1開始計)交換就會把元素3的穩定性打亂,所以快速排序是一個不穩定的排序算法,不穩定發生在key和a[j] 交換的時刻。
Java排序算法——快速排序