一、什么是快速排序
快速排序是对冒泡排序对一种改进
*动图来自菜鸟教程
二、实现方式
- 先从数列中取出一个数作为基准数。
- 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
- 再对左右区间重复第二步,直到各区间只有一个数。
三、关于快速排序的性能参数
1、空间复杂度
最好:
O
(
log
2
n
)
O(\log_2 n)
O(log2n)
最坏:
O
(
n
)
O(n)
O(n)
平均:
O
(
log
2
n
)
O(\log_2 n)
O(log2n)
2、时间复杂度
O ( n 2 ) O(n^2) O(n2)
3、是否稳定
不稳定
4、适用于何类型存储
顺序存储
四、代码实现
1、对于把大的数放到基准数右边,消小的数放到基准数左边
有很多方法
这里使用two pointers
①先将 A[1]存至某个临时变量 temp,并令两个下标 left、right 分别指向序列首尾(如令left=1、right=n)
②只要 right 指向的元素 A[right] 大于 temp,就将 right 不断左移;当某个时候 A[right] ≤temp 时,将元素 A[right]挪到 left 指向的元素 A[left]处。
③只要 left 指向的元素 A[left] 不超过 temp,就将 left 不断右移;当某个时候 A [left]> temp 时,将元素 A[left]挪到 right 指向的元素 A[right]处。
④重复②③,直到 left 与 right 相遇,把 temp(也即原 A [1]) 放到相遇的地方。
代码实现此功能
// 对于[left,right]区间进行划分
int Partition(int A[], int left, int right){
int temp = A[left]; //将A[left]存放在temp中
while(left < right){ // 只要right 与 right不相遇
while(left < right && A[right] > temp) right--; //反复左移right
A[left] = A[right];
while(left < right && A[right] <= temp) right--; //反复左移right
A[right] = A[left];
}
A[left] = temp; //把temp放到left与right相遇的地方
return left; //返回相遇的位置的下标
}
2、快速排序实现
void quickSort(int A[], int left, int right){
if(left < right){
int pos = Partition(A, left, right);
quickSort(A, left, pos - 1); //对左子区间递归进行快排
quickSort(A, pos + 1, right); //对右子区间递归进行快排
}
}
3、程序实例实现
/*
* @Descripttion:
* @version:
* @Author: edisonhuang
* @Date: 2020-03-16 14:45:02
* @LastEditors: edisonhuang
* @LastEditTime: 2020-03-16 15:22:25
*/
#include <iostream>
int Partition(int A[], int left, int right);
void Print(int A[], int len);
void quickSort(int A[], int left, int right);
using namespace std;
int main()
{
int arr[] = {13, 14, 8, 100, 25, 75, 9, 64, 12};
int len = (int) sizeof(arr) / sizeof(*arr);
Print(arr,len);
quickSort(arr, 0, len - 1 );
Print(arr,len);
}
int Partition(int A[], int left, int right){
int temp = A[left]; //将A[left]存放在temp中
while(left < right){ // 只要right 与 right不相遇
while(left < right && A[right] >= temp)
right--; //反复左移right
if (left < right){
A[left] = A[right];
}
while(left < right && A[left] <= temp)
left++; //反复左移right
if (left < right){
A[right] = A[left];
}
}
A[left] = temp; //把temp放到left与right相遇的地方
return left; //返回相遇的位置的下标
}
void quickSort(int A[], int left, int right){
if(left < right){
int pos = Partition(A, left, right);
quickSort(A, left, pos - 1); //对左子区间递归进行快排
quickSort(A, pos + 1, right); //对右子区间递归进行快排
}
}
void Print(int A[], int len)
{
for (int i = 0; i < len; i++)
{
cout << A[i] << " ";
}
cout << endl;
}