Vj排序算法综合实验

要求

  1. 不得使用与实验相关的STL
  2. 需使用类模版(template<class T>)
  3. 需定义排序类,封装各排序方法
  4. 排序数据需使用动态数组存储
  5. 排序类需提供以下操作:名次排序、及时终止的选择排序、及时终止的冒泡排序、插入排序

描述

用任意一种排序方式给出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;

}

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值