快速排序与快速选择算法

原创 2012年03月26日 14:18:59

一、快速排序

(1) 基本思想

(2) C实现

// 快速排序, 平均时间复杂度O(NlogN)
void quickSort( DataType* A, int beg, int end )
{
	int i, j;
	DataType pivot = A[beg];

	if ( beg >= end ) return;   // 递归边界
	
	i = beg;
	j = end+1;

	// 将数组分为小于pivot和大于pivot的两部分
	for( ;; )
	{
		while( A[++i] < pivot );
		while( A[--j] > pivot );
		if ( i > j ) break;
		SWAP( A[i], A[j] );
	}
	SWAP( A[beg], A[j] );

	// 对两个子数组递归
	quickSort( A, beg, j-1 );
	quickSort( A, j+1, end );
}

其中对DataType和SWAP的定义:

typedef int DataType;
#define SWAP(x,y)  {DataType t=x;x=y;y=t;}

二、快速选择算法

(1) 问题描述

(2) 基本思想

(3) C实现

// 快速选择,平均时间复杂度O(N)
int quickSelect( DataType* A, int beg, int end, int K )
{
	DataType pivot; 
	int i, j;

	if ( end - beg + 1 < K )  // error
	{
		printf("error!\n");
		exit(0);
	}

	pivot = A[beg];
	i = beg;
	j = end + 1;

	// 将数组分为小于pivot和大于pivot的两部分
	for ( ;; )
	{
		while( A[++i] < pivot );
		while( A[--j] > pivot );
		if ( i > j ) break;
		SWAP( A[i], A[j] );
	}
	SWAP( A[beg], A[j] );

	if ( j - beg  == K-1 )   // 如果小于pivot的数目刚好为K-1个,这返回该pivot
		return A[j];
	else if ( j - beg >= K ) // 否则,如果小于pivot的数目大于K-1个,则返回该部分中第K大的数
		return quickSelect( A, beg, j-1, K );
	else
		return quickSelect( A, j+1, end, K-(j-beg+1) );
}


快速选择算法

快速选择算法是根据快速排序的划分过程得来,它主要用于在O(n)时间内选择出一组序列的第i个顺序统计量,即第i个最大或最小的数。 对于在一组无序的序列中找出第i个顺序统计量,我们可以把序列进行排序即可...

快速选择(quick_select) 算法分析

快速选择算法,就是从给定的一个集合S={a1,a2,...an}中选出第K个大小的数,或者给出其所在的下标之类的。 如果使用排序,比如merge_sort,然后返回第K个元素的下标,复杂度是O(Nl...

c++实现快速选择算法

在给定的一串序列中,选择出第k大/小的元素。 根据快速排序算法,给出一种解决方案,优点就是只对局部的一部分排序。相比与快速排序算法,快速选择是进行一次递归调用。平均时间为O(N)。 程序如下,给出...
  • cjbct
  • cjbct
  • 2017年01月17日 18:20
  • 516

快速选择select算法

问题描述: 在一个数组中找出第k小的数。 算法: 快速选择select算法。 策略:五分化中项的中项做pivot 复杂度:最坏情况下O(n) 对比: 1、RANDOMIZED...
  • hgqqtql
  • hgqqtql
  • 2014年12月26日 00:20
  • 1166

快速选择SELECT算法的实现

本节,咱们将依据下图所示的步骤,采取中位数的中位数选取枢纽元的方法来实现此SELECT算法,     不过,在实现之前,有个细节我还是必须要提醒你,即上文中2.2节开头处所述,“数组元素索引是从“0...

快速选择算法 C++实现

快速选择算法今天早上想起来了,然后就学了一下,然后发现……这特喵不就是快排删了一半么,总的来说算法本身挺简单的,就是时间复杂度不太好预期(感觉实用性真的不高啊,这个算法) 不过还是写了一下。 不支...

快速选择排序算法

快速排序是对冒泡法排序的一种改进。 排序思想: 通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小;再分别对这两部分记录进行下一趟分割...

各种排序总结(一)之--—冒泡排序、选择排序、快速排序

各种排序总结——冒泡排序、选择排序、快速排序        1、冒泡排序是比较经典的排序方法,是一种用时间换空间的排序方法。我总结了一下它的特点:(1)它的时间复杂度是;(2)每一趟相邻元素两两比较完...

快速选择算法(基于快排)

快排给了我们一种快速选择数组第kk小的思路:         \ \ \ \ \ \ \ \ 利用一个数组中的主元,消耗O(n)O(n)的时间将数组分为两部分(利用Qsort的Part函数):前半部...
  • zzyu5ds
  • zzyu5ds
  • 2016年10月14日 20:56
  • 253

选择算法总结

选择算法 选择算法之选取最大数或最小数 选取最大数或最小数代码实现 选择算法之选取最大数和最小数 选取最大数和最小数代码实现 选取最大数和最小数代码优化 快速选择算法 快速选择算法分析 快速选择算法编...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:快速排序与快速选择算法
举报原因:
原因补充:

(最多只允许输入30个字)