快速排序(升序+降序)

快速排序(升序+降序)

对于大部分的书上的快速排序,都是升序。对于降序,大部分人应该和我一样,并没有什么概念。当然,没有概念的主要原因就是你对快排机制还是不够透彻。

下面是笔者花费很久时间才搞明白的点。如有帮助请点赞+关注+转发

首先,明确一下快排的概念:在一个闭区间,每次确定一个数(我们取最左边得数,a[l])的位置,并且使其余数变得相对有序。

那么看的懂上面的概念应该算是入门了,看不懂得话,先去看看书再回来把。

这里得相对有序,就是升序还是降序得关键了。

  • 升序
    • 从右边开始,小于a[l]的数,全部放到a[l]的左边
    • 从左边开始,大于a[l]的数,全部放到a[l]的右边
  • 降序
    • 从右边开始,大于a[l]的数,全部放到a[l]的左边
    • 从左边开始,小于a[l]的数,全部放到a[l]的右边

接下来看代码:

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
const int mod = 1e9 + 7;
const int maxl = 1e5 + 7;

int n = -1, temp;//n从下标-1开始, 为了,使范围是[0,n], 而不是[0, n) 
int a[maxl];

void quickGreater(int l ,int r){
	if (l < r){//判断是否越界 
		int lnow = l, rnow = r, temp = a[l];
		while (lnow < rnow){//为了找出temp的正确位置,出口lnow == rnow 
			while (lnow < rnow && a[rnow] >= temp)	rnow--;//从最左边,找一个比temp小的数放到temp的位置 
			if (lnow < rnow)	a[lnow++] = a[rnow];
			while (lnow < rnow && a[lnow] < temp)	lnow++;//从最右边,一个比temp大的数放到temp的位置 
			if (lnow < rnow)	a[rnow--] = a[lnow];
		}
		a[lnow] = temp;//把出口,赋上开始的temp 
		quickGreater(l, lnow - 1);//出口左边 
		quickGreater(lnow + 1, r);//出口右边 
	}
}

void quickLess(int l ,int r){
	if (l < r){
		int lnow = l, rnow = r, temp = a[l];
		while (lnow < rnow){
			while (lnow < rnow && a[rnow] < temp)	rnow--;//从最左边,找一个比temp大的数放到temp的位置 
			if (lnow < rnow)	a[lnow++] = a[rnow];
			while (lnow < rnow && a[lnow] >= temp)	lnow++;//从最左边,找一个比temp大的数放到temp的位置 
			if (lnow < rnow)	a[rnow--] = a[lnow];
		}
		
		a[lnow] = temp;
		quickLess(l, lnow - 1);
		quickLess(lnow + 1, r);
	}
}

void slove(){
	while (cin >> temp) a[++n] = temp;//输入 
	
	cout << "快速排序(升序):";
	quickGreater(0, n);
	for (int i = 0; i <= n; i++)	cout << a[i] << '\t';
	cout << endl;
	
	cout << "快速排序(降序):";
	quickLess(0, n);
	for (int i = 0; i <= n; i++)	cout << a[i] << '\t';
	cout << endl;
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int t = 1;
//	cin >> t;
	while (t--){
		slove();
	}
    return 0;
}

/*输入; 
6 3 5
键盘:ctrl + z
*/

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,可以使用快速排序算法来对数组进行升序降序序。下面是一个示例代码,演示了如何使用快速排序算法来实现升序降序序: ```cpp #include <iostream> // 快速排序函数 void quickSort(int arr[], int low, int high, bool ascending) { if (low < high) { int pivot = arr[high]; int i = low - 1; for (int j = low; j <= high - 1; j++) { // 升序序 if (ascending) { if (arr[j] < pivot) { i++; std::swap(arr[i], arr[j]); } } // 降序序 else { if (arr[j] > pivot) { i++; std::swap(arr[i], arr[j]); } } } std::swap(arr[i + 1], arr[high]); int pi = i + 1; quickSort(arr, low, pi - 1, ascending); quickSort(arr, pi + 1, high, ascending); } } // 打印数组函数 void printArray(int arr[], int n) { for (int i = 0; i < n; i++) { std::cout << arr[i] << " "; } std::cout << std::endl; } int main() { int arr[] = {5, 2, 8, 4, 1}; int n = sizeof(arr) / sizeof(arr[0]); std::cout << "原始数组: "; printArray(arr, n); // 使用快速排序进行升序序 quickSort(arr, 0, n - 1, true); std::cout << "升序序结果: "; printArray(arr, n); // 使用快速排序进行降序序 quickSort(arr, 0, n - 1, false); std::cout << "降序序结果: "; printArray(arr, n); return 0; } ``` 在上面的代码中,`quickSort` 函数使用快速排序算法对数组进行序。通过传递 `true` 或 `false` 给 `ascending` 参数,可以设置序的升序降序。`printArray` 函数用于打印数组的元素。 注意:这只是一个简单的示例代码,为了方便理解,数组元素直接在代码中定义。在实际应用中,你可能需要修改代码以适应不同的输入方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值