这是我手写的快排
#include<stdio.h>
void swap(int *x, int *y);
void StandardCount(int a[],int low,int high);
void QuickSort(int a[],int low,int high);
int ml, mh, a[100005];
int main(void)
{
int n, i;
scanf("%d", &n);
for (i = 0; i <= n - 1; i ++)
scanf("%d", &a[i]);
QuickSort(a, 0, n - 1);
for (i = 0; i <= n - 1; i ++)
{
if (i >= 1)
putchar(' ');
printf("%d", a[i]);
}
putchar('\n');
return 0;
}
void swap(int *x, int *y)
{
int t = *x; *x = *y; *y = t;
}
//获取基准坐标,使数列相对有序(左边比基准坐标小,右边比基准坐标大)
void StandardCount(int a[], int low, int high)
{
int l = a[low], m = a[(low+high)/2], h = a[high], key, left = low, right = high;
if (m > l && m < h || m > h && m < l)
swap(&a[low], &a[(low+high)/2]);
else if (h > l && h < m || h > m && h < l)
swap(&a[low], &a[(low+high)/2]);
key = a[low];
while (low < high)
{
//high指针从后向前遍历,元素比基准元素大则指针向前移动
while (low < high && a[high] >= key)//若为降序排序,改为:a[high] <= key
high --;
if (low < high)
a[low] = a[high];
//low指针从前向后遍历,元素比基准元素小则指针向后移动
while (low < high && a[low] <= key)//若为降序排序,改为:a[low] >= key
low ++;
if (low < high)
a[high] = a[low];
}
a[low] = key;//此时low == high,且此位置为空
ml = mh = low;
for (int i = ml - 1; i >= left; i --)
{
if (a[i] == key)
{
swap(&a[i], &a[ml-1]);
ml --;
}
}
for (int i = mh + 1; i <= right; i ++)
{
if (a[i] == key)
{
swap(&a[i], &a[mh+1]);
mh ++;
}
}
}
void QuickSort(int a[], int low, int high)
{
if(low < high)//递归出口
{
StandardCount(a, low, high);
QuickSort(a, low, ml - 1); //比基准元素小的部分继续调用快速排序
QuickSort(a, mh + 1, high); //比基准元素大的部分继续调用快速排序
}
}
手写快排69ms,C++的sort是115ms 都加了氧气