温故知新,基础复习(快速排序及优化)
使用了三值取中和插排优化
#include<stdio.h>
#define InsertSortNumber 10
void InsertSort(int Arra[],unsigned int LowIndex,unsigned int HighIndex)
{
printf("low=%d,high=%d\n",LowIndex,HighIndex);
for (unsigned int i = LowIndex + 1; i <= HighIndex; ++i)
{
int TempValue = Arra[i];
unsigned int j = i;
for (; j > LowIndex && TempValue<Arra[j-1]; --j)
{
Arra[j]=Arra[j-1];
}
printf("j=%d,i=%d\n",j,i);
if(j!=i) {
Arra[j]=TempValue;
}
}
}
int GetPivotByMedianOfThree(int Arra[],unsigned int LowIndex,unsigned int HighIndex)
{
int MedianIndex = LowIndex +(HighIndex - LowIndex)/2;
if (Arra[MedianIndex]<Arra[LowIndex])
{
int TempValue = Arra[LowIndex];
Arra[LowIndex]=Arra[MedianIndex];
Arra[MedianIndex]=TempValue;
}
if (Arra[MedianIndex]<Arra[HighIndex])
{
return Arra[MedianIndex];
}
else if (Arra[HighIndex]>Arra[LowIndex])
{
return Arra[HighIndex];
}
return Arra[LowIndex];
}
unsigned int Partition(int Arra[],unsigned int LowIndex,unsigned int HighIndex,int PivotValue)
{
while(1){
while(Arra[LowIndex]<PivotValue) {
LowIndex++;
}
while(Arra[HighIndex]>PivotValue) {
HighIndex--;
}
if (LowIndex>HighIndex)
{
return LowIndex;
}
int TempValue = Arra[LowIndex];
Arra[LowIndex]=Arra[HighIndex];
Arra[HighIndex]=TempValue;
LowIndex++;
HighIndex--;
}
}
void QuickSort(int Arra[],unsigned int LowIndex,unsigned int HighIndex)
{
if ((HighIndex+1) - LowIndex > InsertSortNumber)
{
int PivotValue = GetPivotByMedianOfThree(Arra,LowIndex,HighIndex);
unsigned int MedianCutIndex = Partition(Arra,LowIndex,HighIndex,PivotValue);
printf("PivotValue=%d,MedianCutIndex=%d\n",PivotValue,MedianCutIndex);
QuickSort(Arra,LowIndex,MedianCutIndex-1);
QuickSort(Arra,MedianCutIndex,HighIndex);
}
else {
InsertSort(Arra,LowIndex,HighIndex);
}
}
int main()
{
int Arra[] = {1,2,3,50,-5,-7,20,-3,-5,10,13,8,6,4,2,0,-2,-4,-6,-8,18};
//int Arra[] = {1,2,3,50,-5,-7,20,-3,10,8};
//int Arra[] = {3,4,6,8,5,1};
QuickSort(Arra,0,sizeof(Arra)/sizeof(Arra[0])-1);
//InsertSort(Arra,0,sizeof(Arra)/sizeof(Arra[0])-1);
printf("%d",Arra[0] );
for (unsigned int i = 1; i < sizeof(Arra)/sizeof(Arra[0]); ++i)
{
printf(",%d",Arra[i] );
}
}
待完善聚集重复元素的优化