快速排序是分治算法的应用之一,关键在Division函数的设计,Division函数的用途是使得特征值所在位置的左边的值都小于特征值,右边位置的值都大于特征值。
1.Division的一种
int Division(int Data[], int Left, int Right)
{
int Base, j, i, t;
Base = Data[Right];
i = Left - 1;
for (j = Left; j < Right; j++)
{
if (Data[j] < Base)
{
i++;
//交换i,j的值
t = Data[i];
Data[i] = Data[j];
Data[j] = t;
}
}
t = Data[Right];
Data[Right] = Data[i + 1];
Data[i + 1] = t;
return i + 1;
}
2.Division的另一种
int Division2(int Data[], int Left, int Right)
{
int Base;
Base = Data[Left];
while (Left < Right)
{
while (Left < Right && Data[Right] >= Base)
{
Right--;
}
Data[Left] = Data[Right];
while (Left < Right && Data[Left] < Base)
{
Left++;
}
Data[Right] = Data[Left];
}
Data[Left] = Base;
return Left;
}
3.QuickSort函数
void QuickSort(int Data[], int Left, int Right)
{
int i;
if (Left < Right)
{
i = Division2(Data, Left, Right);
QuickSort(Data, Left, i - 1);
QuickSort(Data, i + 1, Right);
}
}
main函数
#include<stdio.h>
int Division(int Data[], int Left, int Right);
int DivisionByHoare(int Data[], int Left, int Right);
void QuickSort(int Data[], int Left, int Right);
void PrintData(int Data[], int DataLength);
int main()
{
int N, i;
int Data[100];
scanf("%d", &N);
for (i = 0; i < N; i++)
{
scanf("%d", &Data[i]);
}
QuickSort(Data, 0, N - 1);
PrintData(Data, N);
return 0;
}
void PrintData(int Data[], int DataLength)
{
int i;
for (i = 0; i < DataLength; i++)
{
printf("%d ", Data[i]);
}
}