快速排序(C++语言)

要求根据给定输入,按照快速排序算法(殷人昆第2版教材 P349 程序8-12)进行排序,输出排序结果和median3的返回值。在划分时,以当前序列的首位元素、中间位置元素和最末元素的中间值为枢轴,记为median3。注意,如median3不在首位,需要和首位元素交换位置。

 注:1,cutoff值为5,不足cutoff使用插入排序。

        2,输入、输出格式参见测试用例0。


样例

输入(1)

41
17
34
0
19
#

输出(1)

After Sorting:
0 17 19 34 41 
Median3 Value:
none

输入(2)

61
59
82
-10
31
-2
-3
10
2
108
12
80
-21
127
12
#

输出(2)

After Sorting:
-21 -10 -3 -2 2 10 12 12 31 59 61 80 82 108 127 
Median3 Value:
12 -3 61 

代码

#include<iostream> 
#include<algorithm> 
#include<vector> 
using namespace std;
 
const int cutoff = 5;
vector<int> median;
 
// 插入排序 
void insertionSort(vector<int>& arr, int left, int right) {
    for (int i = left + 1; i <= right; i++) {
        int tmp = arr[i], j = i;
        for (; j > left && arr[j - 1] > tmp; j--)
            arr[j] = arr[j - 1];
        arr[j] = tmp;
    }
}
 
// 计算中位数 
void median3(vector<int>& arr, int left, int right) {
    int center = (left + right) / 2;
 
    if (arr[left] > arr[center])
        swap(arr[left], arr[center]);
    if (arr[left] > arr[right])
        swap(arr[left], arr[right]);
    if (arr[center] > arr[right])
        swap(arr[center], arr[right]);
 
    //将中位数放到right-1位置作为枢纽元 
    swap(arr[center], arr[right - 1]);
}
 
// 快速排序 
void quickSort(vector<int>& arr, int left, int right) {
    if (right - left + 1 <= cutoff) {
        insertionSort(arr, left, right);
        return;
    }
 
    median3(arr, left, right);
    median.push_back(arr[right - 1]); 
 
    int i = left, j = right - 1;
    int pivot = arr[right - 1];
    for (;;) {
        while (arr[++i] < pivot) {}
        while (arr[--j] > pivot) {}
        if (i < j)
            swap(arr[i], arr[j]);
        else
            break;
    }
    swap(arr[i], arr[right - 1]);
 
    quickSort(arr, left, i - 1);
    quickSort(arr, i + 1, right);
}
 
// 主函数处理输入输出 
int main() {
    int num;
    vector<int> nums;
 
    while (cin >> num && cin.peek() != '#') {
        nums.push_back(num);
    }
 
    quickSort(nums, 0, nums.size() - 1);
 
    cout << "After Sorting:" << endl;
    for (const auto& n : nums) {
        cout << n << " ";
    }
    cout << endl;
    cout << "Median3 Value:" << endl;
 
    if (nums.size() > 5) {
        for (int i = 0; i < median.size(); i++) {
            cout << median[i] << " ";
        }
    }
    else cout << "none";
    cout << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值