温故知新,基础复习(快速排序及优化)
使用了三值取中和插排优化
#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] ); } }
待完善聚集重复元素的优化