2016级算法第二次上机-G.ModricWang's Real QuickSort

873

思路

这是一道非常基础的题,目的是帮助大家回顾快排相关的知识。大家完成此题之后应该就对快排有比较深刻的印象了。

对于整个快排的流程,题目描述中已经给了清晰完整的伪代码。需要自己加工的部分就是,需要手动记录下每次划分后的分界线,也就是划分时的变量\(i\)

由于数据较为简单,要求的层数也较浅,实现划分函数后手工调用即可。

时间复杂度\(O(n)\),空间复杂度\(O(n)\)

代码

#include <iostream>

using namespace std;

const int MaxN = (int) 1e7 + 10;

int n;
int nums[MaxN];

int partition(int *arr, int n) {
	int mid = arr[n/2];
	int i = 0, j = n - 1;
	while (i <= j) {
		while (arr[i] < mid) i++;
		while (arr[j] > mid) j--;
		if (i <= j) {
			swap(arr[i], arr[j]);
			i++;
			j--;
		}
	}
	return i;
}

int main() {
#ifdef ONLINE_JUDGE
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
#endif

	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> nums[i];

	int r = partition(nums, n);
	int l = partition(nums, r);

	for (int i = l; i < r; i++)
		cout << nums[i] << " ";

	cout << "\n";

}
posted @ 2017-10-31 15:07  AlvinZH  阅读(310)  评论(0编辑  收藏  举报