非递归快排

本文介绍了一种快速排序的递归实现方法,通过维护递归点记录栈来完成排序过程。具体步骤包括选定划分元素、调整数组顺序,并递归处理左右子数组,最终实现了对整数数组的有效排序。

快排递归特点:双分枝、动态递归

实现:维护递归点记录栈


#include "stdio.h"
void quickSort(int A[]);
void main()
{
	int A[] = {5,9,10,4,6,2,8,7,90,77,5,9};
	int i;
	quickSort(A,(sizeof(A)/sizeof(int)));
	for(i=0;i<12;i++)
	printf("%d/t",A[i]);
	scanf("%d",&i);
}
void quickSort(int A[],int len)
{
	int h = 0;
	int r = len - 1;
	int i,j,t; //选定段的最后一个元素为划分元
	int *B;
	int k = 0;
	B = (int *)malloc( (r+1) * sizeof(int) );
	*B = r;
	i = h;
	j = r-1; //选定段的最后一个元素为划分元
	while(1)
	{
		if(i > j) break;
		while( i<=j ) //<= :当i=j=r-1时,要比较A[i]、A[r]
		{
			while( (A[i] <= A[r]) && i<r ) i++;
			while( (A[j] > A[r]) && j>=i ) j--; //允许j跳过i,让while跳出
			if(i < j)
			{
				t = A[i];
				A[i] = A[j];
				A[j] = t;
			}
		}
		/* 划分元入位*/
		t = A[i];
		A[i] = A[r];
		A[r] = t;
		/* 维护栈*/
		k++;
		*(B+k) = i;
		/* 下次递归段范围*/
		if( i-h <= 1 )
		{
			do
			{
				h = (*(B+k)) + 1; //左半段起点
				k--;
				if( -1 == k )
					break;
				r = (*(B+k)) - 1;
			}while(r <= h);
			i = h;
			j = r - 1;
		}
		else
		{
			r = i - 1;
			i = h;
			j = r - 1;
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值