快速排序算法【数据结构-郝斌】

 方式1、将快速排序分为查找函数和排序函数;

#include <stdio.h>
/*查找函数*/
int Findpow(int *arr, int low, int high)
{
	int flag=arr[low]; //将需要查找位置的第一个数字赋值给flag;
	while (low < high)//边界条件;
	{
		while ((low<high) && (arr[high] >= flag))//当高位大于等于flag标志位时,应该将高位<<右移;
		{
			--high;//右移;
		}
		if (low < high)
		{
			arr[low] = arr[high];//当高位小于flag时,赋值给低位;
		}
		while ((low<high) && (arr[low] <= flag))//当低位小于等于flag标志位时,应该将低位>>左移;
		{
			++low;//左移;
		}
		if (low < high)
		{
			arr[high] = arr[low];//当低位大于flag时,赋值给高位;
		}
	}
	arr[low] = flag;//当low和high重合时,位置找到,将需要查找的数放进位置。
	return low;//将这个位置返回给排序函数;
}

/*排序函数【递归实现】*/
void QiuckSort(int *arr, int low, int high)
{
	int pow=0;//设置位置标志;
	if (low<high)
	{
		pow = Findpow(arr,low, high);//该位置将原来的线性数据分成两半;
		QiuckSort(arr, low, pow-1);//再将左边的数据查找切分;
		QiuckSort(arr, pow+1,high);//再将右边的数据查找切分;
	}
}


/*测试主函数*/
int main()
{
	int a[] = { 4, 1, -2, 56, 22, 4, 7, 52, 4, 8, 6, 2 ,-5};
	int num = sizeof(a) / sizeof(int);
	QiuckSort(a, 0, num-1);
	for (int i = 0; i < num; i++)
	{
		printf("%d   ",a[i]);
	}
	getchar();
	return 0;

}

 方式2、将快速排序合并为一个函数;

[合并时,主要是注意变量的改变问题]

#include <stdio.h>
/*快速排序函数【完整功能】*/
void QiuckSort(int *arr, int low, int high)
{
	
	if (low<high)
	{
		int pow;
		int flag;
		int nlow = low, nhigh = high;//在该函数内low和high属于全局变量,所以应该让局部变量改变,全局变量不变。
		flag = arr[low];
		while (nlow < nhigh)
		{
			while ((nlow<nhigh) && (arr[nhigh] >= flag))
			{
				--nhigh;
			}
			if (nlow<nhigh)
			{
				arr[nlow] = arr[nhigh];
			}
			
			while ((nlow<nhigh) && (arr[nlow] <= flag))
			{
				++nlow;
			}
			if (nlow < nhigh)
			{
				arr[nhigh] = arr[nlow];
			}
		}
		arr[nlow] = flag;
		pow = nlow;
		QiuckSort(arr, low, pow - 1);
		QiuckSort(arr, pow + 1, high);
	}
}

/*测试主函数*/
int main()
{
	int a[] = { 4, 1, -2, 56, 22, 4, 7, 52, 4, 8, 6, 2 ,-5};
	int num = sizeof(a) / sizeof(int);
	QiuckSort(a, 0, num-1);
	for (int i = 0; i < num; i++)
	{
		printf("%d   ",a[i]);
	}
	getchar();
	return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值