大小比较排序算法(C++)

冒泡排序

什么是冒泡排序

描述:
将相邻的两个数比较,将小的调到前头。若有6个数(8,9,5,4,2,0)。第一次比较第1个数和第2个数(8和9)的大小,如果第1个数大于第2个数,就把两个数位置交换,第二次将第2个数和第3个数(9和5)进行比较和交换……如此共进行5次,得到8,5,4,2,0,9的顺序。可以知道,9已经“沉底”,成为最下面的一个数,而小的数“上升”。最小的数0已经向上“浮起”一个位置。经过第一轮(共五次)后,已得到最大的数(在最下面)。
然后进行第二轮比较,对余下的前面5个数字按上述方法进行比较,经过4次比较之后,得到次大的数8(在5个数中最下面的位置)。同理再进行第三轮比较,对余下4个数进行比较……不难看出,对6个数进行比较需要5轮比较。
可以推知,如果有n个数,则要进行(n-1)轮比较(和交换)。再第一轮中要进行(n-1)次两两比较,在第j轮中要进行(n-j)次两两比较。

冒泡排序的应用

假设有10个数,定义数组长度为11,a[0]不用,只用a[1]~a[10]。将这十个数排序。

#include <iostream>

using namespace std;

int main()
{
    int a[11];
    int i,j,t;
    cout << "Please input 10 numbers: " << endl; //输入a[1]~a[10]
    for (i=1; i<11; i++)
        cin >> a[i];
    cout << endl;
    for (j=1; j<=9; j++)                        //共进行9轮比较
        for(i=1; i<=10-j; i++)                  //每轮比较要进行(10-j)次两两比较
            if(a[i]>a[i+1])                     //如果前面的数大于后面的数
            {
                t = a[i];
                a[i] = a[i+1];                  //交换两个数的位置,使小数上浮
                a[i+1] = t;
            }
    cout << "The sorted numbers: " << endl;     //输出10个数
    for (i=1; i<11; i++)
        cout << a[i] << endl;
    cout << endl;
    return 0;
}

打擂法

什么是打擂法

就算没打过擂台,也看过听过吧,规则就是:首先由两个人对战,输的下台,赢得继续在台上。直到淘汰掉所有low的选手,最后只有一个最优的站在台上。举个粗鲁一点的例子:现在要筛选一个村里面 老二 最大的一个人去接受上级的视察,那么所有性别为男的人都要进行“打擂”,即首先需要两个先锋(张三和李四),他们先比,看谁的长。如果张三的长,那么他继续留下来和其他人比。接下来张三和王老五比,王老五的长,那么王老五留下,他又继续和剩下的人比,直到最后比出在所有人中最长的那一位。(注意,在这里我们只举例不会对自身消耗的打擂法,如果是类似于比武或者答题这类的打擂法,这样子对本身的力气和运气都会有一定的消耗,而本例题我们用打擂法来比较大小,是对本身性质的一种打擂,同我们举的比老二的例子一样,都是自身性质,不会轻易随环境因素而改变。)

打擂法的应用

例题:
有个3*4的矩阵,要求编程序求出其中值最大的那个元素的值,以及所在的行号和列号。

#include <iostream>

using namespace std;

int main()
{
    int a[3][4]={{5,12,23,56}, {19,28,37,46},{-12,-34,6,8}}; //数组初始化
    int max = a[0][0]; //打擂法,先令第一个数为最大
    int i,j,row,colum;
    for (i=0; i<=2; i++){
        for (j=0; j<=3; j++){
            if (a[i][j] > max){
                max = a[i][j];  //依次比较大小,把大的数赋值给max
                row = i;          //将大数的行坐标传给m
                colum = j;          //将大数的列坐标传给n

            }
        }
    }
    cout << "So the biggist number in this array is: " << max << endl; //输出数组中最大的数
    cout << "The index is: " << row << " " << colum << endl;                 //输出最大的数的下标
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

独行侠329

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

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

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

打赏作者

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

抵扣说明:

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

余额充值