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

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

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


#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] );
	}
}

待完善聚集重复元素的优化
上一篇:Linux之正则表达式


下一篇:compass typography 排版 常用排版方法[Sass和compass学习笔记]