冒泡排序
什么是冒泡排序
描述:
将相邻的两个数比较,将小的调到前头。若有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;
}