前言
排序是c语言中比较经典的算法,会陆续出文章把排序算法解释清楚
这篇文章首先是冒泡排序,算法比较简单,但有些地方难理解,还需要自己在草稿纸动笔推一遍,就会很容易理解
冒泡排序原理
我们根据冒泡排序的命名来简要理解,每个数字可以代表一个气泡,数字的大小就代表气泡的大小,就像水沸腾的过程,如果是从小到大排序,就是大气泡像后边飘,是水沸腾的前过程。那如果是从大到小排序,就是大气泡向前飘,是水沸腾的最后的一个过程。
冒泡排序:它重复地遍历要排序的列表,每次遍历都比较相邻的两个元素,如果它们的顺序不符合要求(比如要求从小到大排序,但两个元素的顺序是大于小),则交换这两个元素的位置,直到整个列表排序完成。
现在,我们通过一个例子来理解一下吧!
给出任意一串数字,从小到大排序:
38 13 12 25 0
第一轮遍历比较:
解释表格:
- 比较38和13大小,13比38小,交换位置,得到表格第二行的结果
- 比较38和12的大小,12比38小,交换两数的位置,得到表格地三行的结果
- 比较38和25的大小,25比38小,交换两数的位置,得到表格第四行的结果
- 比较38和0的大小,0比38小,交换两数的位置,得到表格最后一行的结果
第二轮遍历比较:
由于第一轮的遍历中,我们可以发现,38和所有的数字都进行了直接的比较,因此沉淀到最后的38 是最大的数字,在第二轮遍历比较中可以不用进行比较,减少循环次数。
在第二轮比较中,得出的较大数字为25,飘到了后边,此时25与其他数字进行了直接或间接的比较。
第三轮遍历比较:
分析方法同前两种,标红部分是已参与比较出来的较大数字,因此不用参与此次比较
第四轮遍历比较:
标红部分是已参与比较出来的较大数字,因此不用参与此次比较
经过四轮比较,可以得出最终排完序的结果:0,12,13 ,25, 38。
总结规律
- 第一层循环:给出了5个数字比较,进行了四次遍历就得出了结果假设给出n个数字比较,则将会进行n-1遍历得出结果。
- 第二层循环:在每一次遍历的时候,会进行两两比较,每一次遍历比较的次数也不同
表格中遍历代表第i次遍历,比较代表每次遍历中两两比较的次数
第一列遍历是遍历次数从0开始计数,得出规律:假设有n个数字比较,会进行n-1次遍历,每次遍历会有n-i-1次比较。
代码
#include<stdio.h>
#include<stdlib.h>
#define N 1000
int main()
{
int i,j,n,a[N],temp;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<(n-1);i++)
{
for(j=0;j<(n-i-1);j++)
{
if(a[j]>a[j+1])
{
temp=a[j+1];
a[j+1]=a[j];
a[j]=temp;
}
}
}
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
小提示:本代码涉及到了数组的输出与输入,如果大家看不懂的话,可以留言,我先给大家简单解释,后续会出一个数组集合,集中分析数组