【待思考】排序算法——快速排序

快速排序思想有点乱啊,思路基本上是理清楚了,但是写代码还是把我绕晕了两小时,明天再来继续理清……代码只能实现部分数组的排序,对于一些特殊数组,如1,1,5,1,1,1,4,1,1,546就乱掉了

【参考链接】写得非常好的,对快速排序的解释,简单易懂快速排序思想

using namespace std;
int AdjustArray(int a[], int x, int y);
void swap(int a[], int x, int y);
void QuickSearch(int a[], int l, int r);
int main()
{
	int a[10] = {1,12,5,31,41,11,4,91,12,546};
	QuickSearch(a, 0, 9);	
	for (int i = 0; i < 10;i++)
	{
		cout << a[i] << endl;
	}
	return 0;
}

void QuickSearch(int a[],int l,int r)
{
	if (l < r)
	{
		int i = AdjustArray(a, l, r);
		QuickSearch(a, l, i - 1);
		QuickSearch(a, i+1, r);
	}
}

int AdjustArray(int a[], int x, int y)//y是数组小标,不是长度
{
	int X = a[x];
	int j = y;
	for (int i = x; i <= y;)
	{
		while (i < j)
		{
			while (a[j]>X)
			{
				j--;
			}
			swap(a, i, j);
			while (a[i] < X)
			{
				i++;
			}
			swap(a, i, j);
		}
		return i;
	}
}
void swap(int a[], int x, int y)
{
	int temp;
	temp = a[x];
	a[x] = a[y];
	a[y] = temp;
}

复习时使用正确版本

int AdjustArray(int s[], int l, int r) //返回调整后基准数的位置
{
	int i = l, j = r;
	int x = s[l]; //s[l]即s[i]就是第一个坑
	while (i < j)
	{
		// 从右向左找小于x的数来填s[i]
		while(i < j && s[j] >= x) 
			j--;  
		if(i < j) 
		{
			s[i] = s[j]; //将s[j]填到s[i]中,s[j]就形成了一个新的坑
			i++;
		}

		// 从左向右找大于或等于x的数来填s[j]
		while(i < j && s[i] < x)
			i++;  
		if(i < j) 
		{
			s[j] = s[i]; //将s[i]填到s[j]中,s[i]就形成了一个新的坑
			j--;
		}
	}
	//退出时,i等于j。将x填到这个坑中。
	s[i] = x;

	return i;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值