自学计算机网络的时候看到一张哈佛案例教学精髓的图片,觉得说的不错,顺便想了一下正在学习的C语言,被动学习都做到位了,看课,看书,理解后做笔记等等;主动学习也做了一部分,但只做了实战演练,没有转教别人,结合我C语言学习过程中遇到的各类麻烦,写篇C语言排序的文章,用我自己的方式讲述,帮助不能理解的朋友理解,顺便得到一些反馈帮助我自己
C语言的排序法有很多种,目前我只学到了选择法和冒泡法,这两种排序主要考察的就是for循环的嵌套循环和数组,里面还涉及一个交换算法,本文的顺序是 交换算法,选择法排序,冒泡法排序
交换算法
交换算法是一个非常常见的算法,一定要搞清楚,其实理解起来也特别简单,但还是要沉下心来去理解,不然就会像我一样,当时理解了,但没记住
算法内容:
为了简化文章,我就只写了主要部分
#include <stdio.h>
int main(void){
int a = 12;
int b = 24;
int temp; //中间变量
temp = a;
a = b;
b = temp;
return 0;
}
算法理解:
这个算法就是将变量a的值和变量b的值进行交换。除了两个变量,还定义一个中间变量,首先将变量a的值赋值给temp,这时候就可以看作变量temp等于变量a;然后将变量b的值赋给变量a,这会儿变量a就装着变量b的值;然后将变量temp的值即变量a的值赋值给变量b,这会儿变量b就装着之前变量a的值了,数值的交换就完成了。
选择法排序
选择法排序也是一种很简单的排序,只不过要用for的嵌套循环和条件语句
算法内容:
#include <stdio.h>
int main(void){
int i,j; //定义循环变量
int temp; //定义中间变量
int a[10] = {1,34,53,2,46,276,346,341,64,24};
/*交换算法*/
for(i=0;i<10;i++){
for(j=i+1;j<10;j++){
if(a[i] > a[j]){
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
/*排序打印*/
printf("最后的排序是:");
for(i=0;i<10;i++){
printf(" %d ",a[i]);
}
return 0;
}
算法理解:
从交换算法开始说:
- 首先进入外层循环,i=0,然后紧接着进入内层循环,j=1
- 然后a[0]与a[1]做比较,如果a[0]>a[1],则通过交换算法进行数值交换,反之a[0]和a[2]比较
- 第一遍比较完后就回到外层循环,此时i=i+1,i就等于1,再进入内层循环,j=2
- 再从头到尾进行一趟比较
- ...
- 只到外层跳出循环,数组的元素就依次装着
选择排序就是从a[0]
开始依次和后面的元素进行比较,第一遍把a[0]及其以后中最小的筛选出来并将值赋给a[0],第二遍把a[1]及其以后中最小的筛选出来并赋值,依次类推,内层循环的j=i+1
是为了不让a[i]
和本身比较而浪费时间,选择排序法是每个元素都要和比自己大的元素进行一次比较。总之:内循环每循环完一次就会就把最小的值给相应的a[i]
冒泡法排序
算法内容:
#include <stdio.h>
int main(void){
int a[10] = {1,23,45,3,443,4432,34,232,4444,432};
int i,j,temp;
for(i=0;i<9;i++)
{
for(j=0;j<9-i;j++)
{
if(a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
printf("排序结果:");
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}
算法理解:
从交换算法开始说:
- 首先进入外层循环,i=0,然后紧接着进入内层循环,j=0
- 然后a[0]和a[1]做比较,如果a[0]>a[1]就交换数值,没有就进行下一个内循环,a[1]和a[2]做比较,
- 内循环一趟结束后最大的值就通过交换算法赋值给a[10]了,然后进入外循环,i就等于2了,再进入内循环
- 还是a[0]和a[1]做比较,然后把第二大的值赋给a[9]
- ...
- 一趟趟的冒泡,排序也就完成了
怎么说呢,冒泡法排序就像打地鼠一样,第一遍把最大的地鼠打到最后,然后第二遍把第二大的地鼠打到最后,依次类推。
咳咳,正经点,冒泡法排序就是两个相邻的元素进行比较,前一个的值比后一个的值大就交换数值,不是就进行下两个元素的比较,内循环一趟就会找出这一趟的最大值,循环10趟就都出来了。然后呢,内循环的跳出条件是j<10-i
原因是第一趟没有a[10]和a[11]的比较,还有个原因是前几次的循环已经把相对较大的比较出来了,如果还去对后面已经排了序的做比较就会浪费时间,虽然写了也没错...
再来说说外循环的作用,外循环的作用就是为了能搞冒泡十趟,还有就是控制内循环的跳出条件