码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-07-22 00:06:27      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:

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

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


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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:

原文地址:http://blog.csdn.net/songjinshi/article/details/46993053

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!