//快速排序->每次排序都会确定一个元素的最终位置
#include<iostream>
using namespace std;
//函数声明
//数组打印
void printArray(int (&)[10]);
//快速排序函数
void quicksort(int(&arr)[10], int start, int end);
//划分排序区间
int partition(int(&arr)[10], int start, int end);
//交换值
void swap(int(&arr)[10], int x, int y);
int main()
{
int arr[10] = {2,1,4,7,0,67,22,88,23,4};
//计算数组的长度
int size = sizeof(arr) / sizeof(arr[0]);
printArray(arr);
cout << endl;
//调用快速排序算法
quicksort(arr, 0, size - 1);
printArray(arr);
cin.get();
}
//打印数组
void printArray(int (&arr)[10])
{
//范围for循环 打印数组内的值
for (int num : arr)
cout << num << "\t";
}
//对数组排序
void quicksort(int(&arr)[10], int start, int end)
{
//如果左边界大于等于右边界 表明此时该子区间已经遍历完了
if (start >= end)
return;
//划分左右两个区间重新排列
int mid = partition(arr, start, end);
//然后左右两边分别调用排序算法在
quicksort(arr, start, mid - 1);
quicksort(arr, mid + 1, end);
}
//划分区间
int partition(int(&arr)[10], int start, int end)
{
//每次取排序区间的第一位为基准值
int pivot = start;
int i = start + 1, j = end;
while (i < j)
{
//当arr[i]<arr[pivot]时 就一直往后遍历 直到遇见比arr[pivot]大的时候为止
while (arr[i] < arr[pivot] && i < j)
{
++i;
}
//当arr[j]>arr[pivot]时 就一直往后遍历 直到遇见比arr[pivot]小的时候为止
while (arr[j] >= arr[pivot] && i < j)
{
--j;
}
//将比基准数值大的和比基准值小的调换位置
swap(arr, i, j);
}
if (arr[i] <= arr[pivot])//排序区间遍历完毕,需要将基准值放到它所属的最终位置
{
swap(arr, i, pivot);
return i;
}
else if (arr[j] > arr[pivot])
{
swap(arr, start, j - 1);
return j - 1;
}
}
//交换两个元素的位置
void swap(int(&arr)[10], int x, int y)
{
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}