前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言选择法与冒泡法排序

C语言选择法与冒泡法排序

作者头像
Aomsir
发布2021-02-25 14:30:06
2.4K1
发布2021-02-25 14:30:06
举报
文章被收录于专栏:Aomsir的专栏Aomsir的专栏

自学计算机网络的时候看到一张哈佛案例教学精髓的图片,觉得说的不错,顺便想了一下正在学习的C语言,被动学习都做到位了,看课,看书,理解后做笔记等等;主动学习也做了一部分,但只做了实战演练,没有转教别人,结合我C语言学习过程中遇到的各类麻烦,写篇C语言排序的文章,用我自己的方式讲述,帮助不能理解的朋友理解,顺便得到一些反馈帮助我自己

C语言的排序法有很多种,目前我只学到了选择法和冒泡法,这两种排序主要考察的就是for循环的嵌套循环和数组,里面还涉及一个交换算法,本文的顺序是 交换算法,选择法排序,冒泡法排序

交换算法

交换算法是一个非常常见的算法,一定要搞清楚,其实理解起来也特别简单,但还是要沉下心来去理解,不然就会像我一样,当时理解了,但没记住

算法内容

为了简化文章,我就只写了主要部分

代码语言:javascript
复制
#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的嵌套循环和条件语句

算法内容

代码语言:javascript
复制
#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
  • 然后a0与a1做比较,如果a0>a1,则通过交换算法进行数值交换,反之a0和a2比较
  • 第一遍比较完后就回到外层循环,此时i=i+1,i就等于1,再进入内层循环,j=2
  • 再从头到尾进行一趟比较
  • ...
  • 只到外层跳出循环,数组的元素就依次装着

选择排序就是从a[0]开始依次和后面的元素进行比较,第一遍把a0及其以后中最小的筛选出来并将值赋给a0,第二遍把a1及其以后中最小的筛选出来并赋值,依次类推,内层循环的j=i+1是为了不让a[i]和本身比较而浪费时间,选择排序法是每个元素都要和比自己大的元素进行一次比较。总之:内循环每循环完一次就会就把最小的值给相应的ai

冒泡法排序

算法内容

代码语言:javascript
复制
#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
  • 然后a0和a1做比较,如果a0>a1就交换数值,没有就进行下一个内循环,a1和a2做比较,
  • 内循环一趟结束后最大的值就通过交换算法赋值给a10了,然后进入外循环,i就等于2了,再进入内循环
  • 还是a0和a1做比较,然后把第二大的值赋给a9
  • ...
  • 一趟趟的冒泡,排序也就完成了

怎么说呢,冒泡法排序就像打地鼠一样,第一遍把最大的地鼠打到最后,然后第二遍把第二大的地鼠打到最后,依次类推。

咳咳,正经点,冒泡法排序就是两个相邻的元素进行比较,前一个的值比后一个的值大就交换数值,不是就进行下两个元素的比较,内循环一趟就会找出这一趟的最大值,循环10趟就都出来了。然后呢,内循环的跳出条件是j<10-i原因是第一趟没有a10和a11的比较,还有个原因是前几次的循环已经把相对较大的比较出来了,如果还去对后面已经排了序的做比较就会浪费时间,虽然写了也没错...

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

版权属于:奥秘Sir(除特别注明外)

本文链接:https://cloud.tencent.com/developer/article/1793223

本站文章采用 知识共享署名4.0 国际许可协议进行许可,请在转载时注明出处及本声明!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 交换算法
  • 选择法排序
  • 冒泡法排序
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档