要求
- 不得使用与实验相关的STL
- 需使用类模版(
template<class T>
) - 需定义排序类,封装各排序方法
- 排序数据需使用动态数组存储
- 排序类需提供以下操作:名次排序、及时终止的选择排序、及时终止的冒泡排序、插入排序
描述
用任意一种排序方式给出n个整数按升序排序后的结果
格式
输入:
输入的第一行是一个整数 n(1<=n<=1000),表示需排序的数的个数。接下来一行是 n 个整数,数的范围是 0 到 1000,每两个相邻数据间用一个空格分隔。
输出:
一行排好序的序列
样例
输入:
5
5 3 4 2 1
输出
1 2 3 4 5
代码实现:
#include <iostream>
using namespace std;
template<class T>
class Sumsort{
public:
Sumsort(T* a1, T* b1, int n1):n(n1), a(a1), r(b1){}
void Ranksort(){
// 对数组中元素进行计算名次
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
// 遍历到本身时跳过
if(j == i){
continue;
}
// 对元素进行计算名次
else{
if(a[i] > a[j]){
r[i]++;
}
// 在两元素相等时,排在后面的元素名次大一些
else if(a[i] == a[j] && i > j){
r[i]++;
}
}
}
}
// 定义一个数组进行帮忙排序
T *x = new T [n];
for(int i = 0; i < n; i++){
x[r[i]] = a[i];
}
// 将辅助函数赋值到原函数,并输出数组
for(int i = 0; i < n; i++){
a[i] = x[i];
cout << a[i] << " ";
}
cout << endl;
delete []x;
}
void Selectionsort(){
bool sorted = false;// 定义布尔代数,便于及时终止
for(int i = 0; i < n - i; i++){
if(!sorted){ // 判断是否已经排序成功
int t = 0;
// 选择最大的元素(上一次最大的元素不在比较范围之内)
for(int j = 0; j < n - i; j++){
if(a[t] < a[j]){
t = j;
}
}
// 判断是否排序成功
if(t == n - i - 1){
sorted = true;
}
// 交换数组中元素位置,完成选择排序
swap(a[t], a[n - i-1]);
}
else{
break;
}
}
// 输出数组
for(int i = 0; i < n; i++){
cout << a[i] << " ";
}
cout << endl;
}
void Bubblesort(){
bool sorted = false;// 便于及时终止
for(int i = 0; i < n; i++){
if(!sorted){ // 判断是否排序成功
// 冒泡排序
for(int j = 0; j < n -1; j++){
if(a[j] > a[j+1]){
swap(a[j], a[j+1]);
}
// 检查是否已经排序成功
int o = 0;
for(int c = 0; c < n - 1; c++){
if(a[c] <= a[c + 1]){
o++;
}
}
if(o == n - 1){
sorted = true;
}
if(sorted){
break;
}
}
}
else{
break;
}
}
// 输出数组
for(int i = 0; i < n; i++){
cout << a[i] << " ";
}
cout << endl;
}
void Insert(){
// 对乱序部分数组进行遍历处理
for(int i = 1; i < n; i++){
int j = 0;
int s = a[i];
// 寻找到大于乱序中选中的元素索引
while(a[j] < a[i]){
j++;
}
// 插入数组排序
for(int d = i; d >j; d--){
a[d] = a[d - 1];
}
a[j] = s;
}
// 输出数组
for(int i = 0; i < n; i++){
cout << a[i] << " ";
}
cout << endl;
}
~Sumsort(){};
private:
int n;
T *a;
T* r;
};
// template<class T>
// Sumsort<T>::Sumsort(T* a1,T* b1,int n1)
// {
// n = n1;
// a = a1;
// r = b1;
// }
int main(){
int n;
cin >> n;
// 定义两个动态数组
int *q = new int[n];
int *r = new int[n];
// 对数组进行赋值
for(int i = 0; i < n; i++){
cin >> q[i];
r[i] = 0;
}
Sumsort<int> a(q, r, n);
// a b;
// 使用名次排序进行排序
a.Ranksort();
//a.Bubblesort(q, n);
// a.Insert(q, n);
// 删除两个动态数组
// delete []q;
// delete []r;
return 0;
}