什么是快速排序?有多快?
快速排序:
- 选择一个基准元素
- 使用双指针,用以交换元素
- 比基准元素小的排到基准元素前面,比基准元素大的排到后面
- 每次排完,基准元素就在他最后应该在的位置
快速排序有多快?
- 平均时间复杂度O(nlogn)
- 最坏时间复杂度O(n),在正序或者逆序的情况下
- 最好的时间复杂度O(nlogn),在基准元素刚好为排序好后的中间元素
图示快速排序
一直移动i,j指针直到相遇
相遇后需要交换j指针指向元素和基准元素
呈上快速排序代码
//交换两数
void swap(int *a,int *b){
int t=*a;
*a=*b;
*b=t;
}
//找到基准元素所在位置并且以其为分界点分区
int partition(int arr[],int low,int high){
int i=low+1,j=high;
int privot=arr[low];//选择第一个元素为基准元素
while(i<j){
while(arr[j]>privot) j--;//j比基准元素大移动不交换
while(arr[i]<privot) i++; //i比基准元素小移动不交换
if(i<j) swap(&arr[i],&arr[j]);//i还是小于j则交换
}
swap(&arr[low],&arr[j]);//交换基准元素
//返回基准元素最后排序完所在位置
return j;
}
//递归快速排序
void quickSort(int arr[],int low,int high){
int k;
//当low>=high的时候就说明排序完成了
if(low<high){
k=partition(arr,low,high);
//递归两边分区
quickSort(arr,low,k-1);
//k已经在他所在位置,不需要再交换了
quickSort(arr,k+1,high);
}
}