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

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

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


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

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

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

时间: 2024-08-04 14:02:23

温故知新,基础复习(快速排序及优化)的相关文章

温故知新,基础复习(二叉堆排序)

温故知新,基础复习(二叉堆排序) 最小堆(最终数组的数据是降序),最大堆(最终数组的数据是升序) 下例是最小堆 #include <stdio.h> #include <stdlib.h> void Swap(int Arra[],unsigned int LeftIndex,unsigned int RightIndex) { int TeampValue = Arra[LeftIndex]; Arra[LeftIndex]=Arra[RightIndex]; Arra[Righ

温故知新,基础复习(一个有序从大到小不重复的数列,任意给出一个sum值,求出数列中所有满足和为sum的数对)

温故知新,基础复习(一个有序从大到小不重复的数列,任意给出一个sum值,求出数列中所有满足和为sum的数对) #include<stdio.h> #include<stdlib.h> void PrintSumNumbers(int Arra[],int ASize,int Sum) { //O(1) if (ASize<2) { printf("The size of the Arra is invalid.\n"); return; } if(Sum&

快速排序的优化(一)随机化快速排序

这周研究快速排序优化策略,首先是利用随机化对快速排序进行优化. 众所周知,之前的基础快速排序算法,其效率一个关键点就在与划分元素的选取,由于之前一直选取的是第一个元素,所以当遇到特殊输入,比如太大或者太小,就会造成区间划分极度不合理. 引入随机化,就是在每一次划分的时候随机选取一个元素作为关键字,用它来进行划分.由于每一次划分都是随机选取,所以每一次都选到不好的元素概率低,可以作为一个优化的方向. 和之前的基础快速排序主要区别有两个 1.首先是partition部分 利用rand产生随机数  ,

【决战西二旗】|快速排序的优化

1.前言 前面的一篇文章https://www.cnblogs.com/backnullptr/p/11934841.html讲了快速排序的基本概念.核心思想.基础版本代码实现等,让我们对快速排序有了一个充分的认识,但还无法达到面试中对快速排序灵活应对的程度. 快速排序是图领奖得主发明的算法,被誉为20世纪最重要的十大算法之一,快速排序为了可以在多种数据集都有出色的表现,进行了非常多的优化,因此对我们来说要深入理解一种算法的最有效的手段就是不断优化提高性能. 通过本文你将了解到以下内容: 快速排

C++基础复习

一. C++与C的比较: C语言是一个结构化语言,它的重点在于算法和数据结构,C语言的设计首先要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到的输出(或实现过程(事物)控制). C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事物)控制. 所以C语言和C++的最大区别在于它们解决问题的思想不同,一个面向过程一个面向对象. C++对C的"增强",表现在六个方面: 1.类型检测更为严格. 2.

算法——基础篇——快速排序

快速排序是一个经常使用的算法,由于每次用的时候,都感觉没有理解清楚,特写一篇文章记录一下. 算法介绍 快速排序有点类似有冒泡排序,冒泡排序从相邻的两个元素比较,小的在左边,大的在右边,这个算法很容易理解.而快速排序它相当于是在一头一尾两边分别排序比较,比较的对象是当前元素值,和一个选定的key值,主题的思想就是通过跟key值比较,把大于key的值放在右边,小于的放在左边这样就完成了一次排序,接着在对key值左边的序列进行同样的操作,右边也是,最后便能将所有的元素给排好序,由于它每次排序,都会分成

软件开发技术基础复习要点

软件开发技术基础复习要点 1.生存周期: 指一个软件从提出开发要求开始,经过需求分析.设计.制造.调试.使用.维护,直到软件产品被淘汰为止的整个过程. 2.简述软件工程的基本原理: 用分阶段的生命周期计划严格管理: 坚持进行阶段评审: 实行严格的产品控制: 采纳现代程序设计技术: 结果应该能清楚地审查: 开发小组应小而精: 承认不断改进软件工程实践的必要性. 3.简述产生软件危机的原因和解决办法: 原因:开发软件所需的高成本与软件产品的低质量之间存在尖锐的矛盾,致使软件开发陷入循环之中,即研制软

JS基础复习

js基础语法 Netcape js基础语法规范(ECMAScript1,2,3,3.1,5(IE9),6   ES    ES6=es2015) DOM BOM BOM :是由浏览器厂商各自实现的,所以差异比较大 DOM:相关的规范  是由W3C维护的 Node的优势  没有浏览器的兼容性问题 前端项目尽量不要使用ES6,需要考虑兼容性问题 --------------------------------数据类型--------------------------- 1.数据类型分类: 基本数据

算法整理(四):浅析快速排序的优化问题

前文介绍了快速排序的单边扫描和双边扫描,但么有做对比,今天来简单分析下. 一.单边扫描的缺点 单边扫描最大的缺点是每次都要交换,如果一个数组是 5 4 3 2 1,用单边扫描的话,则从4开始,4要和4交换一次,3要和3交换一次,依次类推,这种无意义的操作.正因此用双边扫描会更好,第一趟只需交换一次,就能得到1 4 3 2 5这样的数组.但双边扫描也是可以进一步优化的. 二.双边扫描的优化 优化一:对key值得选取应该使用随机选取的原则,而非第一个数字.意义大家都懂得. 优化二:前文的方法是挖坑法