两段快速排序结果不一样
  • 板块题目总版
  • 楼主cllw
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/24 17:40
  • 上次更新2023/10/24 17:47:23
查看原帖
两段快速排序结果不一样
338596
cllw楼主2023/10/24 17:40
void Qsort(int a[], int l, int r){
	if(l >= r) return;
	int flag = a[l], i = l, j = r;
	while(i != j){
		while(j > i && a[j] >= flag) j--;
		swap(a[i], a[j]);
		while(i < j && a[i] <= flag) i++;
		swap(a[i], a[j]);
	}
	Qsort(a, l, i-1);
	Qsort(a, i+1, r);
}

我想把它改得更简洁一点,改成了这样

void Qsort(int a[], int l, int r){
	if(l >= r) return;
	int flag = a[l], i = l, j = r;
	while(i != j){
		while(j > i && a[j--] >= flag);
		swap(a[i], a[j]);
		while(i < j && a[i++] <= flag);
		swap(a[i], a[j]);
	}
	Qsort(a, l, i-1);
	Qsort(a, i+1, r);
}

结果从原来的从小到大排序变成了从大到小排序,这是为什么啊。 完整代码如下

#include <cstdio>
using namespace std;
void swap(int &a, int &b){
	int tmp = a; a = b; b = tmp;
}
void Qsort(int a[], int l, int r){
	if(l >= r) return;
	int flag = a[l], i = l, j = r;
	while(i != j){
		while(j > i && a[j] >= flag) j--;
		swap(a[i], a[j]);
		while(i < j && a[i] <= flag) i++;
		swap(a[i], a[j]);
	}
	Qsort(a, l, i-1);
	Qsort(a, i+1, r);
}
int a[100000];
int main(){
	int n;
	scanf("%d", &n);
	for(int i = 0; i < n; i++)
		scanf("%d", &a[i]);
	Qsort(a, 0, n-1);
	for(int i = 0; i < n; i++)
		printf("%d ", a[i]);
	return 0;
}

谢谢大家

2023/10/24 17:40
加载中...