算法介紹
快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
算法描述
快速排序使用分治法來把一個串(list)分為兩個子串(sub-lists)。具體算法描述如下:
步驟1:從數列中挑出一個元素,稱為 “基准”(pivot );
步驟2:重新排序數列,所有元素比基准值小的擺放在基准前面,所有元素比基准值大的擺在基准的后面(相同的數可以到任一邊)。在這個分區退出之后,該基准就處於數列的中間位置。這個稱為分區(partition)操作;
步驟3:遞歸地(recursive)把小於基准值元素的子數列和大於基准值元素的子數列排序。
算法實現
public void quickSort(int[] num, int left, int right) {
//如果left等於right,即數組只有一個元素,直接返回
if(left>=right) {
return;
}
//設置最左邊的元素為基准值
int key=num[left];
//數組中比key小的放在左邊,比key大的放在右邊,key值下標為i
int i=left;
int j=right;
while(i<j){
//j向左移,直到遇到比key小的值
while(num[j]>=key && i<j){
j--;
}
//i向右移,直到遇到比key大的值
while(num[i]<=key && i<j){
i++;
}
//i和j指向的元素交換
if(i<j){
int temp=num[i];
num[i]=num[j];
num[j]=temp;
}
}
num[left]=num[i];
num[i]=key;
quickSort(num,left,i-1);
quickSort(num,i+1,right);
}
算法分析
時間復雜度度O(nlogn),空間復雜度(logn)。
不穩定排序(例a與b值相同,但是在比較后有可能會發生位置變化)
內排序(所有排序操作都在內存中完成)