快速排序c语言递归和栈实现

本文深入介绍了两种快速排序算法的实现方式:递归方法与栈辅助方法,并详细展示了每种方法的具体步骤,包括交换两个数值的基本操作及如何通过递归或栈来实现分区和排序过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用到一个方法,交换两个数的值

void swap(int *a, int *b)
{
        int temp = *a;
	*a = *b;
	*b = temp;
}


递归实现



void quickSortByRecursion(int *p, int length)  //传递数组指针跟数组长度
{
	int *left = p;  //第一个值设为中间值
	int *right = p + length - 1;
	if (left < right)  //当左边点指针小于右边的指针继续递归
	{
		while (left < right)
		{
			while (*left <= *p && left < right)
				left++;

			while (*right >= *p && right >= left)
				right--;
			if (left < right)
				swap(left, right);
		}
		swap(p, right);  //把第一个值跟righ对应的值交换,此时right指向小于中间值的最后一个数
		quickSortByRecursion(p, right - p); //递归小于中间数
		quickSortByRecursion(right + 1, length - (right - p) - 1);//递归大于中间数
	}
}


栈实现

创建一个栈,提供压栈,出栈等方法

typedef struct stru  //栈结构体
{
	int *p;
	int len;
	int *pnext;
} st;
st *stack=NULL;
void push(int *p,int len)  //压栈
{
	st *nst = (st *)malloc(sizeof(st));
	nst->pnext = stack;
	nst->p = p;
	nst->len = len;
	stack = nst;
}
st* pop()//出栈
{
	st *n = stack;
	if (stack)
		stack = stack->pnext;
	return n;
}
int isempty()//判断是否为空
{
	if (stack)
		return 0;
	else return 1;
}



快速排序栈实现方法

void quickSortByStack(int *p, int len)
{
	push(p, len);
	while (!isempty())//栈为空时结束
	{
		st *n = pop(); //弹出执行参数
		p = n->p;
		len = n->len;
		int *pleft = p;
		int *pright = p + len - 1;
		if (pleft < pright)
		{
			while (pleft < pright)
			{
				while (*pleft <= *p&&pleft < pright)
					pleft++;
				while (*pright >= *p&&pright >= pleft)
					pright--;
				if (pleft < pright)
					swap(pleft, pright);
			}
			swap(p, pright);//把第一个值跟righ对应的值交换,此时right指向小于中间值的最后一个数
			push(p, pright - p); //把需要在快拍的指针跟长度轧入栈
			push(pright + 1, len - (pright - p) - 1);//把需要在快拍的指针跟长度轧入栈
		}
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值