不同排序算法的具体实现及比较

#include<bits/stdc++.h>
using namespace std;

int data[15];
int m, n;  //比较次数与移动次数
//产生10个随机数,封装进数组
void createData() {
    //产生随机数种子
    srand((int)time(NULL));
    for(int i=1; i<=10; i++) {
        data[i] = rand()%50;
     }
}
//直接插入排序
void insertSort() {
    m=n=0;
    int A[15] = {0};
    for(int i=1; i<=10; i++) {
        A[i] = data[i];
    };
    for(int i=2; i<=10; i++) {
        int temp = A[i];
        int j = i;
        //倒序,逐个移动
        while(j > 1 && temp < A[j-1]) {
            A[j] = A[j-1];
            m++;
            n++;
            j--;
        }
        A[j] = temp;
    }
    cout << "插入排序:";
    for(int i=1; i<=10; i++) {
        cout << A[i] << " ";
    }
    cout << endl << "比较次数:" << m;
    cout << endl << "移动次数:" << n << endl;
}
//简单选择排序
void selectSort() {
    m=n=0;
    //备份数据
    int A[15] = {0};
    for(int i=1; i<=10; i++) {
        A[i] = data[i];
    };
    for(int i=1; i<=10; i++) {
        int k = i;
        for(int j=i; j<=10; j++) {
            if(A[j] < A[k]) {
                k = j;
            }
            m++;
        }
        if(k!=i) {
            n++;
            int t = A[i];
            A[i] = A[k];
            A[k] = t;
        }
    }
    cout << "选择排序:";
    for(int i=1; i<=10; i++) {
        cout << A[i] << " ";
    }
    cout << endl << "比较次数:" << m;
    cout << endl << "移动次数:" << n << endl;
}
void base_quickSort(int *arr, int left, int right) {
    if (left > right)
    {
        return;
    }
    int i = left;
    int j = right;
    //取左边的为基准数
    int flag = arr[left];
    while(i != j){
        //从右侧开始找,找到一个比标记小的数
        while (arr[j] >= flag && i<j){
            m++;
            j--;
        }
        //从左侧开始找,找到一个比标记大的数
        while (arr[i] <= flag && i<j)
        {
            m++;
            i++;
        }
        //找好了两个要交换的数之后,交换
        if (i < j){
            n++;
            int temp = 0;
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }

    //改变基数
    arr[left] = arr[i];
    arr[i] = flag;

    //再进行下一轮交换
    base_quickSort(arr, left, i-1);
    base_quickSort(arr, i+1, right);
}
//快速排序
void quickSort() {
    m=n=0;
    int A[15] = {0};
    for(int i=1; i<=10; i++) {
        A[i] = data[i];
    };
    base_quickSort(A, 1, 10);
    cout << "快速排序:";
    for(int i=1; i<=10; i++) {
        cout << A[i] << " ";
    }
    cout << endl << "比较次数:" << m;
    cout << endl << "移动次数:" << n << endl;
}
//希尔排序
void shellSort() {
    m=n=0;
    int A[15] = {0};
    for(int i=1; i<=10; i++) {
        A[i] = data[i];
    };
    int tmp;
    int step = 5;
    while (step)
    {
        for (int i = step+1; i <= 10; i++)
        {
            tmp = A[i];
            int j = i;
            while (j > step && tmp < A[j - step])   //采用直接插入排序
            {
                m++;
                n++;
                A[j] = A[j - step];
                j -= step;
            }

            A[j] = tmp;
        }
        step = step / 2;
    }
    cout << "希尔排序:";
    for(int i=1; i<=10; i++) {
        cout << A[i] << " ";
    }
    cout << endl << "比较次数:" << m;
    cout << endl << "移动次数:" << n << endl;
}
int main()
{
    //产生随机数
    bool flag = true;
    while (flag) {
        createData();
        cout << "产生的随机数:";
        for(int i=1; i<=10; i++) {
            cout << data[i] << " ";
        }
        cout << endl;
        insertSort();
        selectSort();
        quickSort();
        shellSort();
        cout << "是否继续观测比较(Y/N) :";
        char k;
        cin >> k;
        if(k == 'N' || k=='n') {
            flag = false;
        }
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

NCU-wfb

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

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

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

打赏作者

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

抵扣说明:

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

余额充值