快速排序的应用
作者: 冯向阳
时间限制: 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;
}