题目描述
【问题描述】利用快速排序思想实现一系列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()函数便是快速排序,主要利用递归和分治思想的一种排序算法~