快速排序
思路
1.對於一個數組,首先先選擇一個基准值key,這個基准值可以隨意選,但是一般選擇的是這個數組的第一個元素a[0]
2.之后我們對於這個數組,把數組中所有比這個基准值key小的元素向基准值key的左邊扔,把數組中所有比這個基准值key大的元素朝基准值key的右邊扔
3.這樣的話基准值key就成為了一個"分界線",所有比基准值key小的元素都在基准值key的左邊,所有比基准值key大的元素都在key的右邊
4.之后我們在遞歸的對基准值key左邊的序列和右邊的序列進行快速排序
5.最終整個序列就是有序的了
圖解
轉載自http://www.pianshen.com/article/3751395422/
代碼實現
package sort;
public class QuickSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a= {10,9,8,7,6,5,4,3,2,1,0};
for(int k:a)
{
System.out.printf("%d ",k);
}
System.out.println();
quickSort(a, 0, a.length-1);
for(int k:a)
{
System.out.printf("%d ",k);
}
}
public static void quickSort(int a[],int left,int right)
{
if(left>=right)
{
return ;
}
int i=left;
int j=right;
int key=a[left];
while(i<j)
{
while(i<j&&key<a[j])//從右向左找到第一個比key小的值
{
j--;//朝前面尋找
}
a[i]=a[j];//找到之后向左移動
while(i<j&&key>a[i])
{
i++;//從左向右找,找到第一個大於key的值
}
a[j]=a[i];//將比較大的值移動到右邊
}
a[i]=key;//把key移動到中間來分割左右,i現在是分割左右的下標
quickSort(a, left, i-1);
quickSort(a, i+1, right);
}
}
復雜度
- 時間復雜度:O(nlogn)
- 空間復雜度:快速排序使用遞歸,遞歸使用棧,因此它的空間復雜度為O(logn)
- 穩定性:快速排序無法保證相等的元素的相對位置不變,因此它是不穩定的排序算法