点击查看代码
#include<iostream>
using namespace std;
void Swap(int a[], int i, int j) { //互换a[i]和a[j]
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
int Partition(int a[], int left, int right) { //分割序列进行排序,将小于分界点的值放到分界点左边,大于分界点的值放到右边
/*
//1、固定切分:直接取左边界为分界点
int tmp = a[left];//暂存分界点的值用作比较基准,防止后面排序时被覆盖
*/
//2、三数取中切分:选择中间值为分界点位置。元素比较后的结果:a[right]最大,a[left]中间,a[mid]最小
//以中间值a[left]为分界点将数组分为两部分,分界点左边的值较小,分界点右边的值较大
int mid = left + ((right - left) >> 1);
if (a[mid] > a[right]) Swap(a, mid, right); //互换a[mid]和a[right]
if (a[left] > a[right]) Swap(a, left, right);
if (a[mid] > a[left]) Swap(a, mid, left);
int tmp = a[left];//暂存分界点的值用作比较基准,防止后面排序时被覆盖
while (left < right) {
while (left < right && a[right] >= tmp) { //从右往左扫描,直到遇到小于分界点的值
right--;
}
if (left < right) { //right没有超出左界限
a[left++] = a[right];//将小于分界点的值放在左边left区域,然后left右移1位,开始从左往右扫描
}
while (left < right && a[left] <= tmp) {//从左往右扫描,直到遇到大于分界点的值
left++;
}
if (left < right) { //left没有超出右界限
a[right--] = a[left];//将大于分界点的值放在右边right区域,然后right左移1位,开始从右往左扫描
}
}
a[left] = tmp; //每轮结束后left=right,然后将待插入元素放到a[left]中
return left;//返回left用作下次递归的新分界点
}
/*
函数功能:快速排序(升序排序)
函数列表:
a[]:待排序序列
left:待排序序列左边界
left:待排序序列右边界
*/
void QuickSort(int a[], int left, int right) {
//当序列个数递归分解至1个时退出递归
if (left < right) {
int pivot = Partition(a, left, right);//在[left,right]区间内选择分界点,分割序列进行排序
QuickSort(a, left, pivot - 1);//对分界点的左半部分进行快速排序
QuickSort(a, pivot + 1, right);//对分界点的右半部分进行快速排序
}
}
int main(){
int a[] = { 80,30,60,40,20,10,50,70 };
int n = (sizeof(a)) / (sizeof(a[0]));
cout << "序列个数:" << n << endl;
cout << "排序前:";
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << endl;
QuickSort(a, 0, n -1); //快速排序
cout << "排序后:";
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << endl;
return 0;
}