本章文件为C语言的冒泡排序学习中所作笔记,一是为了以后需要方便查找,二是希望能够帮助到须要的家人门。
冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。
冒泡排序的过程我们用示意图简单的表示,从整个排序过程中寻找规律,n个元素只需比较n−1次即可。
假设一个数组中有 7 个元素,现在对这 7 个元素进行排序,只需比较 6 轮即可得到所要的有序序列。
示意图中最后加粗的数字即为经过一轮交换位置固定的数字。示意图如下:
清楚了冒泡排序的过程以及原理后,我们再来看一个动态图
由上两张图片我们也大概的有了一个设计方案,接下来让我进入程序设计:
#include <stdio.h>
//冒泡排序
int main(){
int arr[] = { 9,8,7,4,5,6,1,2,3,0 };
for(int j = 0; j < 9; j++)//控制比较的轮数,j<9 解释1
{
for(int i = 0; i < 9-j; i++)//控制每轮比较的次数 i<9-j 解释2
{
if(arr[i]>arr[i+1])//满足条件数组相邻两个元素进行交换
{
int a = arr[i];
arr[i] = arr[i+1];
arr[i+1] = a;
}
}
}
//循环输出数组验证是否成功
for (int i = 0; i < 9; i++){
printf("%d ",arr[i]);
}
return 0;
}
运行结果:
1、j<9 解释
此处的i几位冒泡排序进行的趟数。数组中共有10个元素,我们称每进行一次从头到尾的冒泡排序(两个相邻元素间进行比较交换(如上arr[i]>arr[i+1]))为一趟冒泡排序。那么当进行完第一趟冒泡排序后数组中最大的数就处于数组的最后一个元素了,以此类推,进行接下来的趟数排序,现在来思考共需要进行几趟冒泡排序:不难得出,当进行完第9趟排序后,数组中最小的数已经处于数组中第一个元素的位置。由此可知,假设数组中数的个数为(n){此处的n也可由操作符sizeof计算},那么共需要进行(n-1)趟冒泡排序,即可将所有的元素升序排列了!
2、i<9-j 解释
此处的j作为交换对数来解释。例如数组总共有10个元素,两两进行比较交换,那么共需要有九对数进行比较交换(即arr[0]和arr[1]、arr[1]和arr[2]、······依次进行),现在按照程序运行逻辑进行:首先j=0,开始进行第一趟冒泡排序; i<9,数组下标从0-8依次两两进行比较交换(即数组下标:0.1,1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9)共进行9对数字间的交换,完成后数组中最大的数字就处在数组中最后一个元素的位置啦,至此第一趟冒泡排序结束。下边i=1,开始进行第二趟冒泡排序。此时i<8,数组下标0-7共进行8对(即0.1,1.2,2.3,3.4,4.5,5.6,6.7,7.8)数字间的交换,交换完成后数组中仅比最大数小的一个元素就处在倒数第二个元素的位置啦。依次向后进行,每进行一趟冒泡排序,那么接下来需要进行比较的数对的对数就要减少一对,所以这就是为什么i<9-j啦