关闭

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

标签: 快速排序非递归排序分治
231人阅读 评论(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网站的观点或立场
    个人资料
    • 访问:66400次
    • 积分:2659
    • 等级:
    • 排名:第15105名
    • 原创:208篇
    • 转载:0篇
    • 译文:0篇
    • 评论:15条
    文章分类
    最新评论