递归-快速排序

快速排序:

#define SWAP(a, b) {int temp; temp = a; a = b; b = temp;}
typedef int	PARAMER_TYPE;

void quick_sort_sub(PARAMER_TYPE *data, int left, int right)
{
	int left_index = left;
 	int right_index = right;
	int pivot = data[(left + right) / 2];

	 while (left_index <= right_index)
	 {
		 for ( ; data[left_index] < pivot; left_index++);	//若想改为降序-->data[left_index] > pivot
		 for ( ; data[right_index] > pivot; right_index--);//若想改为降序--> data[right_index] < pivot

 		if (left_index <= right_index) 
 		{
			SWAP(data[left_index], data[right_index]);
			 left_index++;
			right_index--;
		}
	}

	if (right_index > left)
	{
		quick_sort_sub(data, left, right_index);
	}
	if (left_index < right) 
	{
		 quick_sort_sub(data, left_index, right);
	}
}

void quick_sort(PARAMER_TYPE *data, int data_size)
{
quick_sort_sub(data, 0, data_size - 1);
}

这个例程是对 int 的数组进行排序。向函数 quick_sort()传递 int 型数组 data 和数组的长度, 数组中的元素会被升序排序。quick_sort_sub()将数组 data 的元素从 data[left]到data[right] 的部分进行排序(包括 data[left]和data[right]) 。quick_sort_sub()首先决定 pivot 的值, 然后把数组的元素分成大于
pivot 和小于 pivot 两个类别*。

因为程序优先对数组的左侧进行处理, 所以数组将会被排序成下图中的样子。
在这里插入图片描述

      首先, 原始的数组被分类成大于 pivot 和小于 pivot 两个部分。 对分类后的左侧(部分数组 1) 递归调用自身再次进行分类(1) 。 然后对分类的结果的左侧再分类, 再分类……就这样不断地递归下去, 一直进行到左侧还剩下一个元素(4) , 再去处理右侧。 就这样顺次地连续返回, 对残留的部分进行处理(5) 。
那么在这里, 处理完数组某部分的左侧之后, 之所以处理还能够转移到右侧, 是因为 C 将自动变量 分配在栈中。
这个程序将数组分成两部分之后, 再进行递归调用。 此时, 在栈中分配了新的用于当前部分数组的 内存区域。 另外, 当某部分数组的数据处理完毕, 函数调用返回的时候, 栈会收缩, 调用前的状态恰好处于栈的最初位置。 正因为如此, 处理才这样不断地向右移动。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值