自学计算机网络的时候看到一张哈佛案例教学精髓的图片,觉得说的不错,顺便想了一下正在学习的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]的比较,还有个原因是前几次的循环已经把相对较大的比较出来了,如果还去对后面已经排了序的做比较就会浪费时间,虽然写了也没错...

再来说说外循环的作用,外循环的作用就是为了能搞冒泡十趟,还有就是控制内循环的跳出条件

版权属于:奥秘Sir(除特别注明外)
本文链接:https://blog.say521.cn/archives/516.html
本站文章采用 知识共享署名4.0 国际许可协议进行许可,请在转载时注明出处及本声明!

活动地址
Last modification:February 21st, 2021 at 09:36 pm
If you think my article is useful to you, please feel free to appreciate