快速排序(递归+非递归)

#include<stdio.h>
#include <iostream>
#include<stack>
using namespace std;
//---------------实现一趟排序------------- 
int part(int a[],int first,int last)
{
	int key=a[first];
    while(first<last)
    {
        while(first<last&&a[last]>=key)
        	--last;
        a[first] = a[last];
 
        while(first < last && a[first] <= key)
        	++first;
        a[last] = a[first];    
    }
    a[first] = key;
    return first;
}
//--------------递归调用-------------- 
void Qsort(int *a,int start,int end)
{
	if(start<end)
	{
      int p=part(a,start,end);
      Qsort(a,start,p-1);
	  Qsort(a,p+1,end);
	}
}
//--------------非递归--------------- 
typedef struct{
	int high;
	int low;
}Bor;	//建立结构体存储两个下标 

void qq(int a[],int low,int high)
{
	Bor b;
	int p;
	stack<Bor> s;
	b.low=low;	b.high=high;
	s.push(b);
	while(!s.empty())
	{
		Bor tep;
		tep=s.top();	s.pop();
		p=part(a,tep.low,tep.high);
		if(p-1>tep.low)
		{
			Bor dd;
			dd.low=tep.low;
			dd.high=p-1;
			s.push(dd);
		}
		if(p+1<tep.high)
		{
			Bor dd;
			dd.low=p+1;
			dd.high=tep.high;
			s.push(dd);
		}
	}
}
int main()
{
    int a[] = {5, 1, 6, 8, 7, 9, 4, 2, 3};
    qq(a,0,sizeof(a)/sizeof(a[0]-1));
    for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    {
        printf("%d ",a[i]);
    }
    return 0;
}
/*
//------------------递归一个函数实现---------------- 
void Qsort(int a[], int low, int high)
{
    if(low >= high)
    {
        return;
    }
    int first = low;
    int last = high;
    int key = a[first];
 
    while(first < last)
    {
        while(first < last && a[last] >= key)
        {
            --last;
        }
 
        a[first] = a[last];
 
        while(first < last && a[first] <= key)
        {
            ++first;
        }
         
        a[last] = a[first]; 
    }
    a[first] = key;
    Qsort(a, low, first-1);
    Qsort(a, first+1, high);
}
*/

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值