深入剖析C语言的常用算法系列------02

256 阅读1分钟

1.案例

  • 随机输入一组数字,然后按照从小到大的顺序排列该组数字。 分析:排序是算法中最常见的,本次使用冒泡排序算法实现。具体实现代码如下:
#include <stdio.h>
#define N 3

int main()
{
    int nums[N];  //定义一个数组
    int i, j;     //循环变量
    int temp;     //用来交换的临时变量
    printf("请输入%d个数:",N);
    for(i = 0;i < N;i++)
    {
        scanf("%d",&nums[i]);
    }
    //外层循环控制轮数
    for(i = 0; i < N - 1; i++)
    {
        //内层循环控制每轮的比较次数
        for(j = 0; j < N - i - 1; j++)
        {
            //如果当前值大于后面一个值,就交换
            if(nums[j] > nums[j + 1])
            {
                temp = nums[j];
                nums[j] = nums[j + 1];
                nums[j + 1] = temp;
            }
        }
    }
    printf("\n排序后的结果是:");
    for(i = 0; i < N; i++)
    {
        printf("%d\t", nums[i]);
    }
    return 0;
}
  • 实现效果图如下:

3.png

2.思考

核心代码:

//外层循环控制轮数
    for(i = 0; i < N - 1; i++)
    {
        //内层循环控制每轮的比较次数
        for(j = 0; j < N - i - 1; j++)
        {
            //如果当前值大于后面一个值,就交换
            if(nums[j] > nums[j + 1])
            {
                temp = nums[j];
                nums[j] = nums[j + 1];
                nums[j + 1] = temp;
            }
        }
    }
  • 冒泡排序的灵魂语句:nums[j] > nums[j + 1];比较相邻的两个数,如果当前者比后者大,则进行交换。每一轮排序结束,选出一个未排序中最大的数放到数组后面,如此循环。这是从小到大的升序排序,假如想按照从大到小降序排序,只需要把上面那段语句改成:nums[j] < nums[j + 1]即可。
  • 还有一个常用算法就是交换:
  • temp = nums[j];
  • nums[j] = nums[j + 1];
  • nums[j + 1] = temp;
  • 交换两个变量里面的值需要引入一个临时变量,就好比要交换两杯水,需要拿来一个空杯子,具体做法和倒水的例子一模一样,大家可以用同样的思考方式去理解。
  • 以上就是简单的冒泡排序法,大家可以根据该例子举一反三,谢谢!