快速排序(C++)

题目描述

【问题描述】利用快速排序思想实现一系列1000以内的正整数的排序。(备注:总数据量不超过200。样例输出中的count=7表示总共进行了7趟排序!)
【输入形式】输入若干1000以内的正整数,-1结束输入。
【输出形式】先输出排序前的原始数据,再输出每趟快速排序后的数据;最后输出排好序的结果以及总共进行了多少趟排序。
【样例输入】

6 8 7 9 0 1 3 2 4 5 -1

【样例输出】

排序前:6 8 7 9 0 1 3 2 4 5

5 4 2 3 0 1 6 9 7 8

1 4 2 3 0 5 6 9 7 8

0 1 2 3 4 5 6 9 7 8

0 1 2 3 4 5 6 9 7 8

0 1 2 3 4 5 6 9 7 8

0 1 2 3 4 5 6 8 7 9

0 1 2 3 4 5 6 7 8 9

排序后:0 1 2 3 4 5 6 7 8 9

count=7


解题思路

1、首先设定一个分界值,通过该分界值将数组分成左右两部分。

2、将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。

3、然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。

4、重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。


源代码

#include <bits/stdc++.h>
using namespace std;

//递归输出数组
void Print(int *arr, int i, int n) {
	if (i < n) {
		cout << arr[i] << " ";
		Print(arr, i + 1, n);
	}
}
//快速排序
void QuickSort(int *arr, int s, int t,int len,int &count) {
	int i = s, j = t, temp;
	if (s < t) {
		temp = arr[s];
		while (i != j) {
			while (j > i && arr[j] >= temp)
				j--;
			arr[i] = arr[j];
			while (i < j && arr[i] <= temp)
				i++;
			arr[j] = arr[i];
		}
		arr[i] = temp;
		Print(arr, 0, len);
		count++;
		cout << endl;
		QuickSort(arr, s, i - 1, len, count);
		QuickSort(arr, i + 1, t, len, count);
	}
}

int main() {
	int num[1001], x, i = 0, count = 0;
	while (1) {
		cin >> x;
		if (x == -1)
			break;
		num[i++] = x;
	}
	cout << "排序前:";
	Print(num, 0, i);
	cout << endl;
	QuickSort(num, 0, i - 1, i, count);
	cout << "排序后:";
	Print(num, 0, i);
	cout << endl;
	cout << "count=" << count << endl;
	system("pause");
	return 0;
}

总结

        C++中sort()函数便是快速排序,主要利用递归和分治思想的一种排序算法~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想我记得写信

您的鼓励是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值