最近沒有寫快速排序算法,就轉了一下這個代碼
快速排序算法在數組中選擇一個稱爲主元(pivot)的元素,將數組分爲兩部分,使得 第一部分中的所有元素都小於或等於主元,而第二部分的所有元素都大於主元。對第一部分遞歸地應用快速排序算法,然後對第二部分遞歸地應用快速排序算法。
在最差情況下,劃分由 n 個元素構成的數組需要進行 n 次比較和 n 次移動。因此劃分所需時間爲 O(n) 。最差情況下,每次主元會將數組劃分爲一個大的子數組和一個空數組。這個大的子數組的規模是在上次劃分的子數組的規模減 1 。該算法需要 (n-1)+(n-2)+…+2+1= O(n^2) 時間。
在最佳情況下,每次主元將數組劃分爲規模大致相等的兩部分。設 T(n) 表示使用快速排序算法對包含 n 個元素的數組排序所需的時間,因此,和歸併排序的分析相似,快速排序的 T(n)= O(nlogn)。
import java.awt.List;
/**
* Created by shuxing on 2017/7/12.
*/
public class QuickSort {
public static int[] quickSort(int[] list) {
quickSort(list, 0, list.length - 1);
return list;
}
public static int[] quickSort(int[] list, int first, int last) {
if (first < last) {//遞歸地對主元(pivot)前後的數組進行快排
int pivotIndex = partition(list, first, last);
quickSort(list, first, pivotIndex - 1);
quickSort(list, pivotIndex + 1, last);
}
return list;
}
public static int partition(int[] list, int first, int last) {//操作過程見下圖
int pivot = list[first], low = first + 1, high = last;
//尋找前半數組中大於主元的元素下標和後半數組中小於或等於主元的元素下標
while (high > low) {
while (pivot >= list[low] && low <= high)
low++;
while (pivot < list[high] && low <= high)
high--;
//交換兩個元素
if (low < high) {
int tmp = list[low];
list[low] = list[high];
list[high] = tmp;
}
}
//插入主元進適當位置
while (list[high] >= pivot && high > first)
high--;
if (list[high] < pivot) {
list[first] = list[high];
list[high] = pivot;
return high;
}
else {
return first;
}
}
public static void main(String[] args) {
int[] list = {2,6,3,5,4,1,8,45,2};
list = quickSort(list);
for (int i = 0; i < list.length; i++) {
System.out.println(list[i]);
}
}
}
看到一個更加易懂的快速排序的算法:http://blog.csdn.net/morewindows/article/details/6684558