思想:为当前数找到合适的位置,在这个数之前都是小于这个数的,在这个数之后都是大于这个数的。然后再对前后两部分分别使用快速排序算法的思路进行排序。逐渐递归下去,完成整个排序过程。
时间复杂度:O(nlogn)
核心在于:如果将指定数移到正确的位置
Partition定义:
e>v:直接放在>v的后面
e<v:将e和>v的第一个元素进行交换位置,j++
遍历完成后:
将v和<v的最后一个数调换位置
实现:
#include <iostream>
#include <algorithm>
using namespace std;
//对arr[l,r]做partition
int partition(int arr[], int l,int r){
int j=l;
for(int i=l+1; i<=r; i++)
{
//[l+1,j]<v [j+1,i-1]>v
if(arr[i]<arr[l])
{
swap(arr[j+1],arr[i]);
j++;
}
}
swap(arr[j],arr[l]);
return j;
}
void quickSort(int arr[], int l,int r){
if(l>=r)
return;
int p=partition(arr,l,r); //为数组的第一个数找到正确的位置并返回
quickSort(arr,l,p-1);//<v部分做快排
quickSort(arr,p+1,r);//>v部分做快排
}
int main()
{
int a[10]= {5,8,7,9,6,3,4,1,2,0};
quickSort(a,0,9);
for(int i=0; i<10; i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}