#include<bits/stdc++.h>
using namespace std;
/*
按升序排序理解
快速排序:
自顶而下每次通过选定的主元把数据分成两个部分,左边小于主元,右边大于主元
递归至数据规模小于等于1 。(归并排序是至底向上)
*/
/*
选主元的方法:
选主元的方法很多,下面的一种方法是在首元素、中间元素、尾元素中寻找中位数作为主元
但每种选主元的方法都主要是为了防止数据基本有序时,快排的时间复杂度降为O(n方)级别
*/
void swap(int &e1, int &e2)
{
int temp = e1;
e1 = e2;
e2 = temp;
}
//l和r都是索引
int getPivot(int *arr, int l, int r)
{
int center = (l + r) / 2;
if(arr[l] > arr[center])
swap(arr[l], arr[center]);
if(arr[l] > arr[r])
swap(arr[l], arr[r]);
if(arr[center] > arr[r])
swap(arr[center], arr[r]);
swap(arr[center], arr[r]);
return arr[r];
}
void core(int *arr, int l, int r)
{
if(l < r)
{
int pivot = getPivot(arr, l, r);
int low = l, high = r - 1;
while(true)
{
while(arr[low] < pivot)
low++;
while(arr[high] > pivot)
high--;
if(low < high)
swap(arr[low++], arr[high--]);
else
break;
}
swap(arr[low], arr[r]);
core(arr, l, low - 1);
core(arr, low + 1, r);
}
}
void quickSort(int *arr, int len)
{
core(arr, 0, len - 1);
}
int main()
{
// int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
// int arr[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
int arr[10] = {8, 1, 4, 9, 0, 3, 5, 2, 7, 6};
quickSort(arr, 10);
for(int i = 0; i < 10; i++)
cout << arr[i] << " ";
return 0;
}
快速排序(Quick Sort)
最新推荐文章于 2022-04-19 00:45:00 发布