冒泡排序和快速排序算法练习

——想把C++捡起来,拿2个常用的排序算法练练手。

头文件

#define MAX 100
//函数声明
int *BubbleSort(int size, int *Array);
int *QuickSort(int a, int b, int *Array);
void PrintArray(int *Array, int position1 = MAX, int position2 = MAX);//加了2个默认参数用来显示正在处理的数

using std::cin;
using std::cout;

源文件

—— 采用了一个一维动态数组储存输入数列,不知道有没有必要……

#include <iostream>
#include "Header.h"

int main()
{
    int a[MAX], i = 0, j=0;
    int method=0,flag=1;
    char ch;

    cout <<"这里是排序算法小实验\n请输入一组整数型数列,以0表示结束:\n";
    do{
        cin >> a[i];
    } while (a[i++] != 0);
    int len = i-1;
    int *p = new   int[len];//定义一个变长的动态一维数组;
    for (i = 0; i < len+1; i++)//len+1 使得以0作为结束
    {
        p[i] = a[i];
    }
    cout << "您输入的数列为:";
    PrintArray(p);
    cout << "\n共"<<len<<"个数\n请选择您要使用的排序算法:(输入1 冒泡排序 输入2 快速排序)\n";

    while (flag)//用flag标记代替goto语句,限制输入
    {
        cin >> method;//选择算法序号
        switch (method)
        {
        case 1:cout << "\n冒泡排序步骤如下:\n"; p = BubbleSort(len, p); flag = 0; break;
        case 2:cout << "\n快速排序步骤如下:\n"; p = QuickSort(0, len - 1, p); flag = 0; break;
        default:cout << "您没有输入正确的号码!请重新输入\n"; break;
        }
    }
    cout << "\n排序的结果为:\n";
    PrintArray(p);
    cout << "\n谢谢使用!\n";
    cin >> ch;
    delete[] p;
}

几个函数的定义

int *BubbleSort(int size, int *Array)//冒泡排序
{
    int temp;
    int i, j;
    for (i = 0; i < size - 1; i++)
    {
        cout << "第" << i + 1 << "次排序:";
        for (j = 1; j < size - i; j++)
        {
            if (Array[j - 1] >= Array[j])//两两比较,把大数往后排
            {
                temp = Array[j - 1];
                Array[j - 1] = Array[j];
                Array[j] = temp;//完成交换
            }
        }
        PrintArray(Array, size - i - 1);//打印
    }
    return Array;
}

——快速排序比较难写,有分治还有递归,8年没碰C++了……

int *QuickSort(int a, int b, int *Array)//快速排序
{
    int i = a, j = b;//分治思想,i从左往右扫描,j从右往左扫描
    int k = i;
    int temp = Array[k];//以Array[k]的值为标准判别数列,大数放右边,小数放左边
    int count;//记录排序次数

    while (i != j)
    {
        while (Array[k]<Array[j])//从尾巴与Array[k]比较
        {
            j--;//尾巴都大于Array[k],扫描下一个
        }
        if (k != j)
        {
            temp = Array[k];//尾巴有小于Array[k]跳出,位置交换
            Array[k] = Array[j];
            Array[j] = temp;
            k = j;
            i++;
        }
        else
        {
            break;//队尾全部大于Array[k]
        }
        while (Array[i]<Array[k])//前面与Array[k]比较
        {
            i++;//前面都小于Array[k],扫描下一个
        }
        if (i != k)
        {
            temp = Array[k];//前面有大于Array[k]跳出,位置交换
            Array[k] = Array[i];
            Array[i] = temp;
            k = i;
            j--;
        }
        else
        {
            break;//前面全部小于Array[k]
        }
    }
    count++;
    cout << "第" <<count<< "次排序:";
    PrintArray(Array, k);//打印队列,k位置前面的数都比它小,k位置后面的数都比它大
    if (k > a + 1)
    {
        int *front = QuickSort(a, k - 1, Array);//将k位置前面的数递归快速排序
    }
    if (k + 1 < b)
    {
        int *after = QuickSort(k + 1, b, Array);//将k位置后面的数递归快速排序
    }
    return Array;
}

—— 在头文件的函数声明中设了2个默认参数,定义时不用加默认值了,不然会报错。

void PrintArray(int *Array, int position1, int position2)//打印数列
{
    int i = 0;
    if (position1 == MAX && position2 == MAX)//没有位置参数
    {
        while (Array[i] != 0)
        {
            cout << Array[i] << "\t";
            i++;
        }
    }
    else if (position1 != MAX  && position2 == MAX)//有1个位置参数
    {
        while (Array[i] != 0)
        {
            if (position1 == i)
            {
                cout << "*";
            }
            cout << Array[i] << "\t";
            i++;
        }
    }
    else if (position1 != MAX  && position2 != MAX)//有2个位置参数,给二叉树排序准备的
    {
        while (Array[i] != 0)
        {
            if (position1 == i || position2 == i)
            {
                cout << "*";
            }
            cout << Array[i] << "\t";
            i++;
        }
    }
    cout << "\n";
}

运行

输入数列

冒泡排序

快速排序

可见快速排序优于冒泡排序。

看到那些*号了吗?嘻嘻,这就是PrintArray()中默认参数Position们的功劳


——写代码真是件容易着迷的事情,不想去吃饭,居然还忘了挤奶,哎哟,我是苦逼的背奶妈妈~明天不能忽略宝宝的口粮了~~~><!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值