【东华大学oj】快速排序的应用

快速排序的应用

作者: 冯向阳

时间限制: 1s

章节: 课程设计

问题描述

已知线性表(a1 a2 a3 „an)按顺序存于内存,每个元素都是非零整数。在使用顺序表ADT的基础上,试设计基于快速排序的思想把所有值为负数的元素移到全部正数值元素前边的算法:例:(x,-x,-x,x,x,-x,x)变为(-x,-x,-x,x,x,x)。

提示:要求重排n个元素且以顺序存储结构存储的线性表,使得所有值为负数的元素移到正数元素的前面。这可采用快速排序的思想来实现。只是比较的标准是元素是否为负数。因此枢轴元素的值为0(不是线性表中的元素)。基本思路是,先设置好上、下界和枢轴值(0),然后执行一趟快速排序,即利用震荡交替法分别从线性表的两端查找正数和负数,找到后互相交换,直到上下界相遇。

参考函数原型:

template<class ElemType>

void Rearrange( SqList<ElemType> &A );

输入说明

第一行:顺序表A的长度

第二行:顺序表A的数据元素(数据元素之间以空格分隔)

输出说明

第一行:排序前的顺序表遍历结果

空行

第三行:第一组值交换的中间结果

...

第n行:最终的输出结果

#include <iostream>
#include <vector>
#include <algorithm>

template <class ElemType>
class SqList {
public:
    std::vector<ElemType> elements;
    SqList(int size) : elements(size) {}

    int Length() const {
        return elements.size();
    }

    ElemType& operator[](int index) {
        return elements[index];
    }

    const ElemType& operator[](int index) const {
        return elements[index];
    }
};

template<class ElemType>
void Rearrange(SqList<ElemType> &A) {
    int left = 0;
    int right = A.Length() - 1;

    // 打印初始顺序表
    for (int i = 0; i < A.Length(); ++i) {
        if (i > 0) std::cout << " ";
        std::cout << A[i];
    }
    std::cout << std::endl;
    std::cout << std::endl;

    while (left < right) {
        while (left < right && A[left] < 0) ++left;
        while (left < right && A[right] >= 0) --right;
        if (left < right) {
            std::swap(A[left], A[right]);

            // 打印中间结果
            for (int i = 0; i < A.Length(); ++i) {
                if (i > 0) std::cout << " ";
                std::cout << A[i];
            }
            std::cout << std::endl;
        }
    }
}

int main() {
    int n;
    std::cin >> n;
    SqList<int> A(n);
    for (int i = 0; i < n; ++i) {
        std::cin >> A[i];
    }

    Rearrange(A);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Juneeeeeeeeeeeee

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值