三种快速排序法

/*交换函数:为了提高效率,当所交换的两个元素值不相等时,用异或运算*/
void swap(int *a, int *b)
{
	if (*a != *b){
		*a = *a^*b;
		*b = *a^*b;
		*a = *a^*b;
	}
	else{
		int temp = *a;
		*a = *b;
		*b = temp;
	}
}

/*第一种快排:只有一个长度n,每次需计算出low和high指针*/
int QuickSort_process1(int *a, int n)
{
	int low, high, temp;
	low = 0;
	high = n - 1;
	temp = a[0];
	while (low < high){
		while (low < high&&temp <= a[high])
			--high;
		if (low < high)
			a[low] = a[high];
		while (low<high&&temp>a[low])
			++low;
		if (low < high)
			a[high] = a[low];
	}
	a[high] = temp;
	return high;
}
void QuickSort1(int *a,int n)
{
	int pos;
	if (n>0){
		pos = QuickSort_process1(a, n);
		QuickSort1(a, pos);
		QuickSort1(a + pos + 1, n - pos - 1);
	}
}

/*第二种快排:有两个指针,一个快,一个慢。快的指针找比基元素小的数,慢的指针指向比基元素小的最后一个元素*/
/*这样,在排序结束后,整个数组就被基元素分为了两部分。*/
int QuickSort_process2(int *a, int n)
{
	int first, second, temp;
	first = 0;
	second = -1;
	temp = a[n - 1];
	while (first != n){
		if (a[first] < temp){
			swap(a+second+1,a+first);
			++second;
		}
		++first;
	}
	swap(a + second + 1, a + n - 1);
	return second + 1;
}

void QuickSort2(int *a, int n)
{
	int pos;
	if (n > 0){
		pos = QuickSort_process2(a,n);
		QuickSort2(a, pos);
		QuickSort2(a + pos + 1, n - pos - 1);
	}
}

/*第三种快排,比较传统的那种,参数中有low指针和high指针*/
int QuickSort_process3(int *a, int low, int high)
{
	int l, h, temp;
	l = low;
	h = high;
	temp = a[low];
	while (l < h){
		while (l< h&&a[h] >= temp)
			--h;
		if (l < h)
			a[l] = a[h];
		while (l < h&&a[l] < temp)
			++l;
		if (l < h)
			a[h] = a[l];
	}
	a[h] = temp;
	return h;
}

void QuickSort3(int *a, int low,int high)
{
	int pos;
	if (low < high){
		pos = QuickSort_process3(a,low,high);
		QuickSort3(a,low,pos-1);
		QuickSort3(a,pos+1,high);
	}
}

三种快速排序法

时间: 2024-07-28 18:55:34

三种快速排序法的相关文章

三种快速排序以及快速排序的优化

一.  快速排序的基本思想 快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小.之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的. 二.  快速排序的三个步骤 1) 选择基准:在待排序列中,按照某种方式挑出一个元素,作为 "基准"(pivot): 2) 分割操作:以该基准在序列中的实际位置,把序列分成两个子序列.此时,在基准左边的元素都比该基准小,在基准右边的元素都比基准大: 3) 递归地对两个序列进行快速排序,直到

【转】三种快速排序算法以及快速排序的优化

一.  快速排序的基本思想 快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小.之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的. 二.  快速排序的三个步骤 1) 选择基准:在待排序列中,按照某种方式挑出一个元素,作为 “基准”(pivot): 2) 分割操作:以该基准在序列中的实际位置,把序列分成两个子序列.此时,在基准左边的元素都比该基准小,在基准右边的元素都比基准大: 3) 递归地对两个序列进行快速排序,直到序列为空或

数据结构之简单排序的三种玩法

本文主要介绍,一个简单排序算法都可以有哪几种玩法(以选择排序为例,代码请在cpp文件下运行) 选择排序...总结为三个步骤就是: 1.在一段区间内找最大/最小元素. 2.将最大/最小元素与区间中的第一个值进行交换 3.缩小查找区间 如果你还没有理解?不用担心,请参考:选择排序_百度百科:http://baike.baidu.com/item/选择排序 玩法1:初窥门径 如果理解了选择排序的算法,想要把它实现成一段代码,对于代码能力比较强的小伙伴来说,并不是一件复杂的事情,因此我们达到的第一重境界

字符串类型1、strip,lstrip,rstrip 2、lower,upper 3、startswith,endswith 4、format的三种玩法 5、split,rsplit 6、join 7、replace8、isdigit # 判断

# name="11YAng11xin11"# strip# print(name.strip("1"))#去掉两边相同的字符# print(name.lstrip("1"))#l:表示左,在strip加l等于去掉左边的字符# print(name.rstrip("1"))#r:表示右,在strip加r等于去掉右边的字符 # lower,upper# name="11YAng11xin11"# print(

【转】三种快速排序算法的实现(递归算法、非递归算法、三路划分快速排序)

原文:http://blog.csdn.net/left_la/article/details/8206405 快速排序的三个步骤: 1.分解:将数组A[l...r]划分成两个(可能空)子数组A[l...p-1]和A[p+1...r],使得A[l...p-1]中的每个元素都小于等于A(p),而且,小于等于A[p+1...r]中的元素.下标p也在这个划分过程中计算. 2.解决:通过递归调用快速排序,对数组A[l...p-1]和A[p+1...r]排序. 3.合并:因为两个子数组时就地排序,将它们的

生命游戏的三种玩法

生命游戏 每个细胞有两种状态--存活或者死亡,每个细胞只与以其自身为中心的细胞产生互动. 当细胞为死亡状态,若周围有3个存活细胞,则该细胞变成存活状态(模拟繁殖) 当细胞为存活状态,若周围有2个或3个存活细胞,保持原样 若周围有3个以上存活细胞,该细胞变成死亡(模拟极度拥挤) 若周围有低于2个一下存活细胞,该细胞死亡(模拟人口稀疏) 这个游戏也叫康威生命游戏.细胞自动机.元胞自动机等. 图案介绍 "脉冲星":它周期为3,看起来像一颗爆发的星星 "滑翔者":每4个回合

三种快速排序的效率对比(普通、多线程、amp)

参照:http://www.codeproject.com/Articles/543451/Parallel-Radix-Sort-on-the-GPU-using-Cplusplus-AMP 对于普通PC电脑而言,在数据量较小时,多线程优于GPU加速:数据量较大时,GPU加速优于多线程. main.cpp 1 #include <amp.h> 2 #include <chrono> 3 #include <algorithm> 4 #include <conio

编程中三种命名方法——匈牙利命名法、骆驼命名法、帕斯卡(pascal)命名法

代码风格是一个可重不重要的东西,虽然,不影响代码正确性,但是其实,非常的重要,通常在项目中,不能随便写代码,需要有一点的规范,命名法便是其中一个比较重要的一点. 通常我自己有一套命名法,结合匈牙利法(主要是数据类型这块,因为嵌入式,数据类型比较重要,毕竟资源比较少的),其次是其他两种方法结合,下面说说主要的三种命名法. 以下文字为转载的,说的比较清晰,很多人已经逐步抛弃匈牙利命名法,因为缩写不易懂,而且现在命名也不行定长度,不想以前,命名长度都是尽量短.时代在进步~ 一.匈牙利命名法: 广泛应用

JavaScript的三种工业化玩法

JavaScript的三种工业化玩法 软件工程中任何的语言如果想要写出健壮的代码都需要锋利的工具,当然JavaScript也不例外,很多朋友刚入门的时候往往因为工具选的不对而事半功倍,JavaScript同样需要软件调试技术,希望本文总结的三种工具会对大家的学习有所帮助. 任何语言的学习都离不开实践,不写代码是永远学不会编程的,当然javascript也不例外,很多人推荐直接浏览器调试,个人觉得这个推荐应该是非常初级的,比如Chrome, Firefox确实提供了实用的前端调试工具,但是个人认为