关闭

【数据结构笔记】7:非递归快速排序

标签: 快速排序非递归排序分治
355人阅读 评论(0) 收藏 举报
分类:

快速排序,分而治之。在同为O(N*logN)的几种排序方法中效率较高。

*递归和非递归的快排

#ifndef __QUICK_SORT_H__
#define __QUICK_SORT_H__

#include "Assistance.h"				// 辅助软件包
#include <queue>
template <class ElemType>
void QuickSort(ElemType elem[], int low, int high, int n)
// 操作结果:对数组elem[low .. high]中的元素进行快速排序
{
    ElemType e = elem[low];				// 取枢轴元素 
    int i = low, j = high;
	while (i < j)	{
		while (i < j && elem[j] >= e)	// 使j右边的元素不小于枢轴元素
			j--;
		if (i < j)
            elem[i++] = elem[j];

		while (i < j && elem[i] <= e)	// 使i左边的元素不大于枢轴元素
			i++;
		if (i < j)
            elem[j--] = elem[i];
	}
	elem[i] = e;
    cout << "排序区间:" << low << "--" << high << ";中枢位置为:" << i << endl; 
    Display(elem, n);
    cout << endl;
    if (low < i-1)	QuickSort(elem, low, i - 1, n);		// 对子表elem[low, i - 1]递归排序
	if (i + 1 < high) QuickSort(elem, i + 1, high, n);	// 对子表elem[i + 1, high]递归排序
}

template <class ElemType>
void sort(ElemType elem[],int a,int b)
//直接比较完成排序a~b
{
	bool flag=1;
	while(flag==1)
	{
		flag=0;
		for(int i=a;i<b;i++)
		{
			if(elem[i]>elem[i+1])
			{
				swap(elem[i],elem[i+1]);
				flag=1;
			}
		}
	}
}

void swap(int &a,int &b)
{
	int c;
	c=a;
	a=b;
	b=c;
}

template <class ElemType>
void Lzh(ElemType elem[],int low,int high,int n)
// 操作结果:对数组elem[low .. high]中的元素进行快速排序
{
	queue<int> myQue;//只存游标
	int a,b,c;//as helper
	myQue.push(low);
	myQue.push(high);
	while(!myQue.empty())
	{
		//出队两个游标
		a=myQue.front();
		myQue.pop();
		b=myQue.front();
		myQue.pop();
		//取游标中点
		c=(a+b)/2;
		//选择a,b,c中elem值居中的为c
		if(elem[a]<elem[b]&&elem[b]<elem[c] || elem[c]<elem[b]&&elem[b]<elem[a])
			c=b;
		else if(elem[b]<elem[a]&&elem[a]<elem[c] || elem[c]<elem[a]&&elem[a]<elem[b])
			c=a;
		//否则c就是c
		ElemType e = elem[c];				// 取枢轴元素
		int i = a, j = b;
		swap(elem[c],elem[i]);//和第一个交换
		while (i < j)	{
			while (i < j && elem[j] >= e)	// 使j右边的元素不小于枢轴元素
				j--;
			if (i < j)
			{
				elem[i++] = elem[j];
			}
			while (i < j && elem[i] <= e)	// 使i左边的元素不大于枢轴元素
				i++;
			if (i < j)
			{
				elem[j--] = elem[i];
			}
		}
		elem[i] = e;
		/*cout << "排序区间:" << a << "--" << b << ";中枢位置为:" << i << endl; 
		Display(elem, n);
		cout << endl;*/
		if((b-i)>(i-a))//较短的先入队
		{
			if(i-a<=3)//很短直接比较完成排序
				sort(elem,a,i-1);
			else//否则还是要入队
			{
				myQue.push(a);
				myQue.push(i-1);
			}
			if(b-i<=3)//很短直接比较完成排序
				sort(elem,i+1,b);
			else//否则还是要入队
			{
				myQue.push(i+1);
				myQue.push(b);
			}
		}
		else//(b-i)<=(i-a),则先b-i
		{
			if(b-i<=3)//很短直接比较完成排序
				sort(elem,i+1,b);
			else//否则还是要入队
			{
				myQue.push(i+1);
				myQue.push(b);
			}
			if(i-a<=3)//很短直接比较完成排序
				sort(elem,a,i-1);
			else//否则还是要入队
			{
				myQue.push(a);
				myQue.push(i-1);
			}
		}
		
	}

}
#endif


*测试

#include "QuickSort.h"			// 快速排序算法
#include <time.h>

int main(void)
{
	int a[10000];
	int n=10000;
	for(int i=0;i<n;i++)
	{
		a[i]=rand()%100;
	}
	cout << "排序前:"<<endl;
	Display(a, n);
	

	time_t start=clock();
	Lzh(a, 0, n - 1, n);//非递归实现快排的函数
	//QuickSort(a, 0, n - 1, n);
	time_t finish=clock();
	double k=(double)(finish-start)/CLOCKS_PER_SEC;
	Display(a, n);				
	cout << "排序用时:"<<k<<endl;
	system("PAUSE");			
	return 0;					
}

部分运行结果:





0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

快速排序的两种实现思路和非递归实现--C++实现

思路一:        第一种是根据算法导论上的思想:取数组的最后一个元素为主元,i初始化为最低位元素的前一个位置,j指向遍历数组中待排序的元素,当j所指元素比主元小的时候i= i + 1,然后交换...
  • u012691335
  • u012691335
  • 2016-09-14 15:00
  • 699

快速排序的非递归算法(使用队列)

前些天学习了程序栈空间的大小是会有上限的。看来递归的算法永远无法应用到大规模的数据上,毕竟栈空间有限。这几天写了点算法题目,刚好涉及到如何广度优先搜索。想起自己学数据结构的时候就想快排能否以非递归式方...
  • meiboyu
  • meiboyu
  • 2014-01-13 20:07
  • 1906

快速排序的非递归实现

华夏35度 Data Mining,NLP,Search Engine 快速排序的非递归实现 首先说明一下快速排序是对冒泡排序的改进。为什么这么说呢?想一下冒泡排序,它把...
  • pi9nc
  • pi9nc
  • 2013-09-26 16:31
  • 21766

【数据结构】大量数据(20万)的快速排序的递归与非递归算法、三数取中思想

快速排序的挖坑法与prev、cur法,我们在上一篇博客的第6个排序中讲的非常详细,http://10740184.blog.51cto.com/10730184/1774508【数据结构】常用排序算法...
  • hanjing_1995
  • hanjing_1995
  • 2016-05-30 17:19
  • 927

快速排序的非递归实现

这里讲了快速排序的递归实现插入排序 快速排序 分析整理,这里写一下非递归实现,非递归实现的要点是利用栈保存partition操作的子区间,即左边的坐标和右边的坐标。partition操作跟递归实现一样...
  • x_i_y_u_e
  • x_i_y_u_e
  • 2016-04-19 16:24
  • 972

快速排序的两种实现思路和非递归实现--C++实现

思路一:        第一种是根据算法导论上的思想:取数组的最后一个元素为主元,i初始化为最低位元素的前一个位置,j指向遍历数组中待排序的元素,当j所指元素比主元小的时候i= i + 1,然后交换...
  • u012691335
  • u012691335
  • 2016-09-14 15:00
  • 699

快速排序的三种实现方式以及非递归版本

一、快速排序的基本思想 快速排序利用了分治的思想,分而治之。通过一趟排序将序列分为两部分,其中一部分比较关键字小,一部分比关键字大。之后继续对这两个子序列重复此过程,直到整个序列都有序。 二、快速...
  • a1414345
  • a1414345
  • 2017-07-02 22:30
  • 1161

快速排序的非递归算法(使用队列)

前些天学习了程序栈空间的大小是会有上限的。看来递归的算法永远无法应用到大规模的数据上,毕竟栈空间有限。这几天写了点算法题目,刚好涉及到如何广度优先搜索。想起自己学数据结构的时候就想快排能否以非递归式方...
  • meiboyu
  • meiboyu
  • 2014-01-13 20:07
  • 1906

快速排序的非递归实现

华夏35度 Data Mining,NLP,Search Engine 快速排序的非递归实现 首先说明一下快速排序是对冒泡排序的改进。为什么这么说呢?想一下冒泡排序,它把...
  • pi9nc
  • pi9nc
  • 2013-09-26 16:31
  • 21766

快速排序C++实现(递归,非递归)

#include #include #include using namespace std; int quickSortRecusive(vector& data,int i,int j) ...
  • a2211455
  • a2211455
  • 2016-09-01 16:23
  • 1480