一、定义
1.定义:
冒泡排序:1 ,4,3,2,5, 8 , 9, 10 十个数字,从第一个元素开始和相邻右侧元素比较,相邻两个元素依次比较,二者中大的换到右边,小的到左边,从第一个元素开始,比到倒数第二个元素9和10比较后,一轮结束,此时最右侧是一组数中的最大值,第二轮比较时只需要比较到第八个元素和第九个元素就行;以此类推,每次比较次数比上一轮少1。
例:第一个元素1开始:1和4比,1比4小,不换位置;接着第二个元素4开始:4和右侧3比较,4比3大,换位置;依次.....
2.自己理解:
相当于是一排10个人,相邻的两个人依据身高互换位置,高的站在右边,矮的站在左边。重点是,在代码实现时,比较的时候时有方向有轮次的,第一轮从左到右结束后,开始第二轮。
思路:
写在下方代码处,大家可以结合例题看。
二、应用举例
例题:
冒泡题:输入10个数,将它们存入数组,用冒泡法对其进行升序排序。
1.创建数组
首先创建数组arr[10],并用for循环输入十个数;
#include<stdio.h>
int main()
{
int arr[10];
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0])-1;//数组的最大下标
for (i = 0; i <= sz; i++)
{
scanf("%d", &arr[i]);
}
2.冒泡排序,对相邻数字按规则交换
sz=sizeof(arr)/sizeof(arr[0])-1 ://也就是数组的最大下标9
由于需要不同轮次来排一次序,又循环次数确定,所以确定使用for(i = 0; i <= sz; i++)循环;
单次循环中,相邻数字比较,可通过循环,但循环次数会根据不同轮次发生改变,即sz -1 -i;因为sz-1-i:表示最大比较次数,第一个元素比较的时候,除了自己一共比较sz-1次,并且不同轮次比较后,已经确定最大数字,所以不用比较已经确定的,即几个轮次,也就少比较i次。
for (i = 0; i <= sz; i++)//下面的sz-1-i的理解比较总要,在上面文字已经解释,大家可以看一下
{
int j = 0;
for (j = 0; j <= sz - 1 - i; j++)//j最大为8,j+1最大9;所以不会越界
{
int tmp = 0;
if (arr[j] > arr[j + 1])
{
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
3.用循环输出
for (i = 0; i <= sz; i++)
{
printf("%d ", arr[i]);
}
冒泡及选择做题总结(理解的关键点和易错点):