数据结构排序算法之快速排序

The first principle:排序过程需要回退(不是一往无前的),不宜采用非递归算法。

快速排序的基本思想:

排序初始条件:排序集合初始化为这个待排序的顺序表表中所有元素。

选择排序集合的第一个元素作为轴值,

对排序集合进行一次划分。

对一次划分后的左半区进行快速排序。(不断缩小排序集合)

对一次划分后的右半区进行快速排序。

不断重复上述过程,直到到排序结束。

排序结束条件:排序集合的元素为1个或0个

一次划分结束条件:工作指针相遇。


快速排序之递归算法:

#include<stdio.h>
#include<string.h>


int Partition(char szChar[], int nLowerBound, int nUpperBound);


void QuickSort(char szChar[], int nLowerBound, int nUpperBound)
{
if (nLowerBound >= nUpperBound)					//递归结束条件
{
	return;
}
else
{	int nIndexOfAxisValue = Partition(szChar, nLowerBound, nUpperBound);
	QuickSort(szChar, nLowerBound, nIndexOfAxisValue - 1);
	QuickSort(szChar, nIndexOfAxisValue + 1, nUpperBound);
}

}
int Partition(char szChar[], int nLowerBound, int nUpperBound)
{
	int i = nLowerBound, j = nUpperBound;
	//int nAxis = szChar[nLowerBound];
	int nTempValue = 0;


	while (i != j)
	{
		//右侧扫描
		while ((i < j)&&szChar[i] < szChar[j])
		{
		 	j--;	//工作指针左移
		}
		if (i < j)
		{
			//交换元素
			nTempValue = szChar[i];
			szChar[i] = szChar[j];
			szChar[j] = nTempValue;
			i++;			//工作指针右移
		}

		//左侧扫描
		while ((i < j)&&szChar[i] < szChar[j])
		{
			i++;			//工作指针右移
			if (i < j)
			{
				//交换元素
				nTempValue = szChar[i];
				szChar[i] = szChar[j];
				szChar[j] = nTempValue;
				j--;			//工作指针左移,准备重复右侧扫描
			}
		}

		return i;//返回轴值最终位置
	}
int main()
{
	char szChar[] = "xiangshedfb";
	printf("快速排序之前的顺序表:");
	for (unsigned int i = 0; i < strlen(szChar); i++)
	{
		printf("%c ", szChar[i]);
	}

	printf("\n********\n", szChar);

	QuickSort(szChar, 0, strlen("xiangshedfb") - 1);

	printf("快速排序之后的顺序表:");
	for (unsigned int j = 0; j < strlen(szChar); j++)
	{
		printf("%c ", szChar[j]);
	}

	return 0;
}<img src="https://img-blog.csdn.net/20141003132606678?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhbmdzaGVueWl5YW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值