比较排序的一种,其实快速排序是基于 “二分” 的思想。快速排序之所比较快,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点
的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。
快速排序:
时间复杂度 O(nlogn)
空间复杂度O(logn)
不稳定 【两个时间复杂度O(nlogn)
的排序算法都不稳定】
由于关键字的比较和交换是跳跃进行的,因此,快速排序是一种不稳定的排序方法。
最坏
O(n^2)
,最好
O(n)
空间复杂度:递归造成的栈空间的使用,最好情况,递归树的深度logn
空间复杂的logn
,最坏情况,需要进行n‐1
递归调用,其空间复杂度为 O(n)
,
平均情况,空间复杂度也为O(log2n)
。
int partition(int A[], int begin, int end){
int i = begin;
int j = end;
int q;
int pivot = begin;
int pivotnumber = A[pivot];
while(i!=j){
int temp;
while(A[j]>pivotnumber && i<j){
j--;
}
while(A[i]<=pivotnumber && i<j)
{
i++;
}
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
if(i == j){
int temp;
temp =A[pivot];
A[pivot] = A[i];
A[i] = temp;
}
return i;
}
void sort(int A[], int begin,int end){
if(begin<end){
int q;
q = partition(A,begin, end);
sort(A,begin, q-1);
sort(A,q+1,end);
}
}
int main() {
int array[] = {8,7,1,6,5,4,3,2};
sort(array, 0, 7);
for(int i=0;i<array.length;i++){
cout<< array[i]<<" ";
}
}