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

简介: 温故知新,基础复习(快速排序及优化)使用了三值取中和插排优化#include#define InsertSortNumber 10void InsertSort(int Arra[],unsigned int LowIndex,uns...

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

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


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

待完善聚集重复元素的优化
目录
相关文章
|
7月前
|
存储 缓存 算法
【数据结构与算法】【小白也能学的数据结构与算法】递归 分治 迭代 动态规划 无从下手?一文通!!!
【数据结构与算法】【小白也能学的数据结构与算法】递归 分治 迭代 动态规划 无从下手?一文通!!!
|
2月前
|
搜索推荐 算法
数据结构与算法学习十四:常用排序算法总结和对比
关于常用排序算法的总结和对比,包括稳定性、内排序、外排序、时间复杂度和空间复杂度等术语的解释。
29 0
数据结构与算法学习十四:常用排序算法总结和对比
|
7月前
|
存储 搜索推荐 算法
【排序】软考笔记:简要回顾下常见的几种排序算法
【排序】软考笔记:简要回顾下常见的几种排序算法
131 0
【排序】软考笔记:简要回顾下常见的几种排序算法
|
7月前
|
存储 算法 搜索推荐
【数据结构与算法】【初学者也能学的数据结构与算法】迭代算法专题
【数据结构与算法】【初学者也能学的数据结构与算法】迭代算法专题
|
7月前
|
存储 搜索推荐 算法
【数据结构入门精讲 | 第八篇】一文讲清全部排序算法(2)
【数据结构入门精讲 | 第八篇】一文讲清全部排序算法(2)
34 0
|
7月前
|
搜索推荐 算法 大数据
【数据结构入门精讲 | 第十篇】考研408排序算法专项练习(二)
【数据结构入门精讲 | 第十篇】考研408排序算法专项练习(二)
141 0
|
7月前
|
存储 搜索推荐 算法
【数据结构入门精讲 | 第九篇】考研408排序算法专项练习(一)
【数据结构入门精讲 | 第九篇】考研408排序算法专项练习(一)
422 0
|
7月前
|
搜索推荐 算法 Shell
【数据结构入门精讲 | 第七篇】一文讲清全部排序算法(1)
【数据结构入门精讲 | 第七篇】一文讲清全部排序算法(1)
39 0
|
存储 搜索推荐 算法
数据结构与算法之三 深入学习排序
数据结构与算法之三 深入学习排序
43 0
|
前端开发
前端知识案例-归并排序
前端知识案例-归并排序
62 0
前端知识案例-归并排序