开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情
1、写在前面
大家好,今天文章的内容是:
- 快速排序
2、内容
介绍
快速排序(Quick Sort,也称分区交换排序)是对冒泡排序算法的一种改进。在冒泡排序中,记录的比较和移动是在相邻的位置进行的,记录每次交换只能消除一个逆序,因而总的比较和移动次数较多。在快速排序中,通过分区间的一次交换能消除多个逆序。实际上,快速排序名副其实,它是目前最快的内部排序算法,被评为“20世纪十大算法”。
步骤
- 首先,设定一个分界值
pivot; - 接着将大于分界值的数据划分到分界值的右边,将小于或等于分界值的数据集中到分界值的左边。
- 就这样,通过该分界值
pivot可以将数组分成左右两部分。 - 然后,对于左边和右边的数据可以再进行快速排序,比如对于左侧数据,再取一个分界值,将左侧数据再分为两部分,右侧数据也做同样处理;
- 重复以上过程,直到子序列只有一个记录为止。
可以发现,快速排序是一个递归定义,也可以认为是基于分治法的排序(快速、归并)。
示意
代码
快速排序示意如下:
#include <iostream>
using namespace std;
// 用首元素将待排序的序列划分为左右两个部分
int partition(int A[], int low, int high) {
// 将序列的首元素视为分界值(枢轴)
int pivot = A[low];
// 用low和high搜索枢轴的最终位置
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];
}
A[low] = pivot; // 枢轴元素存放在最终位置
return low; // 返回存放枢轴的最终位置
}
// 递归实现
void QuickSort(int A[], int low, int high) {
if(low<high) {
int pivotPos = partition(A, low, high); // 划分
QuickSort(A, low, pivotPos-1); // 划分左子表
QuickSort(A, pivotPos+1, high); // 划分右子表
}
}
// 主函数
int main() {
int arr[9] = {90, 20, 50, 40, 80, 10, 70, 30, 60};
QuickSort(arr, 0, 8);
for(int i : arr) {
cout << " " << i;
}
return 0;
}
3、写在最后
好了,文章的内容就到这里,感谢观看。