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

简介: C语言选择法与冒泡法排序

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

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

相关文章
|
6月前
|
C语言
【C 语言经典100例】C 练习实例37 - 排序
【C 语言经典100例】C 练习实例37 - 排序
32 0
|
13天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
56 8
|
13天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
46 7
|
1月前
|
算法 C语言
【C语言】排序查找
【C语言】排序查找
|
6月前
|
编译器 C语言
C语言进阶⑯(自定义类型)项目:静态通讯录,增删查改排序打印。
C语言进阶⑯(自定义类型)项目:静态通讯录,增删查改排序打印。
51 1
|
1月前
|
NoSQL 算法 Redis
Redis的实现三:c语言实现平衡二叉树,通过平衡二叉树实现排序集
本博客介绍了如何在C语言中实现一个平衡二叉树,并通过这个数据结构来模拟Redis中的排序集功能。
14 0
|
6月前
|
存储 C语言
Leetcode—— 删除排序数组中的重复项——C语言
Leetcode—— 删除排序数组中的重复项——C语言
|
6月前
|
存储 搜索推荐 算法
C语言数据结构算法,常用10种排序实战
插入排序(Insertion Sort) 希尔排序(Shell Sort) 选择排序(Selection Sort) 冒泡排序(Bubble Sort) 归并排序(Merge Sort) 快速排序(Quick Sort) 堆排序(Heap Sort) 基数排序(Radix Sort)
68 1
C语言数据结构算法,常用10种排序实战
|
6月前
|
算法 搜索推荐 数据处理
C语言中的排序与查找技术详解
C语言中的排序与查找技术详解
70 1
|
6月前
|
C语言
【C语言/数据结构】排序(直接插入排序|希尔排序)
【C语言/数据结构】排序(直接插入排序|希尔排序)
42 4