分析一下总是错的原因:没用笔自己试一下
#define CutOff 100
#include<stdio.h>
#include<stdlib.h>
void QuickSort(int* a, int Left, int Right);
int FindMedium(int* a, int Left, int Right);
void QuickSortF(int* a, int n);
void InsertSort(int* a, int Right, int Left);
int main()
{
int N;
scanf("%d", &N);
int* a = (int*)malloc(sizeof(int) * N);
for (int i = 0; i < N; i++)
{
scanf("%d", a + i);
}
QuickSortF(a, N);
for (int i = 0; i < N - 1; i++)
{
printf("%d ", a[i]);
}
printf("%d", a[N - 1]);
}
void QuickSort(int* a, int Left, int Right)
{
if (Right - Left > CutOff)
{
int PVot = FindMedium(a, Left, Right);
int i = Left + 1;
int j = Right - 2;
int Tmp;
while (1)
{
while (a[i] < PVot) {
++i;
}
while (a[j] > PVot)
{
--j;
}
if (i < j)
{
Tmp = a[i];
a[i] = a[j];
a[j] = Tmp;
++i;
--j;
}
else
{
Tmp = a[i];
a[i] = PVot;
a[Right - 1] = Tmp;
break;
}
}
QuickSort(a, Left, i - 1);
QuickSort(a, i + 1, Right);
}
else
InsertSort(a, Right, Left);
}
int FindMedium(int* a, int Left, int Right)
{
int Center = (Left + Right) / 2;
int Tmp;
if (a[Left] > a[Right])
{
Tmp = a[Right];
a[Right] = a[Left];
a[Left] = Tmp;
}
if (a[Left] > a[Center])
{
Tmp = a[Center];
a[Center] = a[Left];
a[Left] = Tmp;
}
if (a[Center] > a[Right])
{
Tmp = a[Right];
a[Right] = a[Center];
a[Center] = Tmp;
}
Tmp = a[Right - 1];
a[Right - 1] = a[Center];
a[Center] = Tmp;
return a[Right - 1];
}
void QuickSortF(int* a, int n)
{
QuickSort(a, 0, n - 1);
}
void InsertSort(int* a, int Right, int Left)
{
int Tmp;
int j;
for (int i = Left + 1; i < Right + 1; i++)
{
Tmp = a[i];
for (j = i; j > Left && a[j - 1] > Tmp; j--)
{
a[j] = a[j - 1];
}
a[j] = Tmp;
}
}