温故知新,基础复习(快速排序及优化)

来源:互联网 发布:井泵电机数据 编辑:程序博客网 时间:2024/05/18 04:59

温故知新,基础复习(快速排序及优化)

使用了三值取中和插排优化


#include<stdio.h>#define InsertSortNumber 10void 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] );}}

待完善聚集重复元素的优化

1 0
原创粉丝点击