快速排序属于交换排序的一种。
快速排序
算法思想:
复杂度
递归调用层数:
- 最好时间复杂度:每次选的枢轴元素都能将序列分成均匀的两部分。
- 最坏时间复杂度:序列原本就是有序或者逆序的,此时 时间、空间复杂度最高 (可以进行优化,尽量选择可以把数据均匀分成两部分的枢纽元素)。
快速排序是所有内部排序算法中平均性能最优的排序算法。
最坏情况与较好情况
最坏情况
比较好的情况
代码实现
/**
* 快速排序
* @file QuickSort.cpp
* @author xg
* @date 2022-11-02
*
*/
#include <iostream>
#include <stdio.h>
using namespace std;
// 利用基准值划分区间
int partition(int A[], int low, int high) {
// 1.用数组中第一个元素作为基准值
int pivot = A[low];
// 2.从表的两端交替的向中间扫描
while(low < high) {
while(low < high && A[high] >= pivot) {
high--;
}
A[low] = A[high];// 将比基准值小的元素移动到左区间
while(low < high && A[low] <= pivot) {
low++;
}
A[high] = A[low];// 将比基准大的元素移动到右区间
}
// 最终low=high指向空位置
A[low] = pivot; // 将基准值存放到最终位置;
return low;
}
void quickSort(int A[], int low, int high) {
if(low < high) {
// 将待排序数组一分为二,算出枢轴值
int pivotPosition = partition(A, low, high);
quickSort(A, low, pivotPosition-1);// 左区间
quickSort(A, pivotPosition+1, high);// 右区间
}
}
void PrintArray(int A[], int n) {
for(int i = 0;i < n;i++) {
cout << A[i] << " ";
}
cout << endl;
}
int main() {
int arr[] = {100,6,5,3,2,1,99};
cout << "排序前:";
PrintArray(arr, 7);
quickSort(arr,0,6);
cout << "排序后:";
PrintArray(arr, 7);
return 0;
}
注:以上图片来自B站王道数据结构截图