zoukankan      html  css  js  c++  java
  • C语言实现冒泡排序-整数排序

    我一直觉得排序算法挺重要的,但是却没有深入的去理解它;

    没有深入理解就无法用代码将它实现;

    在腾讯的在线模拟考试中就有一题问到冒泡排序;

    我几乎是傻眼了!我知道这样的问题是最基础的;

    无论过去怎样现在要全面深入的理解所有排序算法;

    让我们从最简单的冒泡开始吧!

    Problem

    你想要将(4,3,5,1,2)排序成(1,2,3,4,5)

    你决定使用最简单的冒泡排序;

    Solution

    首先,假定你知道C语言的基本语法。

    vim bubble_sort.c

    打开编辑器后,你不要着急写代码;

    想想自己需要哪些函数帮助自己解决问题;

    首先,对于数据的对比。你应该明白自己需要一个叫做cmp_int(int number_1,int number_2);

    其次,你可能需要对两个数据的位置进行交换。因此,一个叫做swap(int number_1,int number_2)的函数也是应当存在的;

    最后,你应该需要一个能够遍历这个数组的函数,当然也就冒泡排序的主要框架bubble_sort(int arr[],int len);

    因此,你的声明应该如下代码所示:

      #include <stdio.h>
       
       int cmp_int(int number_1,int number_2);
       void swap(int number_1,int number_2);
       void bubble_sort(int arr[],int len);

    为了测试数据是否正确排序,你需要一些数据;

    因此你需要一个数组numbers;

    当然,为了能够更好的显示你的数组确实正确的排序啦!你需要打印它里面的每一个元素;

    因此你需要这样写你的main函数;

    #include <stdio.h>
    
    int cmp_int(int number_1,int number_2);
    void swap(int number_1,int number_2);
    void bubble_sort(int arr[],int len);
    
    int main(void)
    {
        int numbers[] = { 4,3,5,1,2 };
        int i ; 
        for (i = 0; i < 5; ++i)
        {   
            printf("%d	",numbers[i]);
    
        }   
        puts("");
    
    
        return 0;
    }

    对于冒泡排序的实现,我不会过多的讲解它的原理;

    可以参考(。。。。)描述的比较清楚;

    那么接下来用代码来实现我们的核心函数;

    #include <stdio.h>
    
    int cmp_int(int number_1,int number_2);
    void swap(int number_1,int number_2);
    void bubble_sort(int arr[],int len);
    
    int main(void)
    {
        int numbers[] = { 4,3,5,1,2 };
        int i ;
        for (i = 0; i < 5; ++i)
        {
            printf("%d	",numbers[i]);
    
        }
        puts("");
    
    
    
        return 0;
    }
    
    int cmp_int(int number_1,int number_2)
    {
        return number_1 > number_2 ? 1:0;
    }
    
    void swap(int number_1,int number_2)
    {
        int tmp ;
        tmp = number_1;
        number_1 = number_2;
        number_2 = tmp;
    }
    
    void bubble_sort(int arr[],int len)
    {
        int i,j;
        for (i = 0;i < len -1; i++)
        {
            for (j = 0 ; j < len - 1 -i ; j++)
            {
    
                if (cmp_int(arr[j],arr[j+1]))
                    swap(arr[j],arr[j+1]);
            }
        }
    }

    接下来,我们将在main函数中依次调用这些函数进行测试:

    首先,测试cmp_int函数:

    int main(void)
    {
        int numbers[] = { 4,3,5,1,2 };
        int i ; 
        for (i = 0; i < 5; ++i)
        {   
            printf("%d	",numbers[i]);
    
        }   
        puts("");
    
    // For Test cmp_int function 
        if (cmp_int(1,2)){
            //if 1 > 2,return 0
            puts("Biger");
        }else{
            puts("smaller");
        }   
    
        return 0;
    }

    结果如下:

    接下来测试,swap函数:

    int main(void)
    {
        int numbers[] = { 4,3,5,1,2 };
        int i ; 
        for (i = 0; i < 5; ++i)
        {   
            printf("%d	",numbers[i]);
    
        }   
        puts("");
    
    // For Test cmp_int function 
        if (cmp_int(1,2)){
            //if 1 > 2,return 0
            puts("Biger");
        }else{
            puts("smaller");
        }   
    // For Test swap function 
        int x = 100;
        int y = 200;
        printf("x = %d	y = %d
    ",x,y);
        swap(x,y);
        printf("x = %d	y = %d
    ",x,y);
    
    
        return 0;
    }

    运行结果如下:

    结果并没有实现x,y两个的值交换;

    原因是什么呢?

    首先,你要理解C语言的参数是传值;

    因此,当你把值传给函数,它只是得到一个局部临时变量中,因此,无论你怎么操作,也只是对一个副本而言;

    因此,你需要用到指针来解决这个问题。(关于指针与参数,可以参考。。。。)

    我们把swap改写为如下:

    int cmp_int(int number_1,int number_2);
    void swap(int *number_1,int *number_2);
    void bubble_sort(int arr[],int len);
    void swap(int *number_1,int *number_2)
    {
        int tmp ;
        tmp = *number_1;
        *number_1 = *number_2;
        *number_2 = tmp;
    }

    主函数调用swap也应该把传值参数,改为传地址;

    全部修改后如下:

    int cmp_int(int number_1,int number_2);
    void swap(int *number_1,int *number_2);
    void bubble_sort(int arr[],int len);
    
    int main(void)
    {
        int numbers[] = { 4,3,5,1,2 };
        int i ;
        for (i = 0; i < 5; ++i)
        {
            printf("%d	",numbers[i]);
    
        }
        puts("");
    
    // For Test cmp_int function 
        if (cmp_int(1,2)){
            //if 1 > 2,return 0
            puts("Biger");
        }else{
            puts("smaller");
        }
    // For Test swap function 
        int x = 100;
        int y = 200;
        printf("x = %d	y = %d
    ",x,y);
        swap(&x,&y);
        printf("x = %d	y = %d
    ",x,y);
    
    
        return 0;
    }
    
    int cmp_int(int number_1,int number_2)
    {
        return number_1 > number_2 ? 1:0;
    }
    
    void swap(int *number_1,int *number_2)
    {
        int tmp ;
        tmp = *number_1;
        *number_1 = *number_2;
        *number_2 = tmp;
    }

    注意,因为你修改来swap得函数参数,因此在bubble_sort函数里面调用swap时会报错,你可以修改为如下:

    void bubble_sort(int arr[],int len)
    {
        int i,j;
        for (i = 0;i < len -1; i++)
        {
            for (j = 0 ; j < len - 1 -i ; j++)
            {
    
                if (cmp_int(arr[j],arr[j+1]))
                    swap(&arr[j],&arr[j+1]);
            }
        }
    }

    运行,结果如下:

    可以看出,交换函数已经正常工作;

    接下来测试排序主函数;

    int main(void)
    {
        int numbers[] = { 4,3,5,1,2 };
        int i ; 
        for (i = 0; i < 5; ++i)
        {   
            printf("%d	",numbers[i]);
    
        }   
        puts("");
    
    // For Test cmp_int function 
        if (cmp_int(1,2)){
            //if 1 > 2,return 0
            puts("Biger");
        }else{
            puts("smaller");
        }   
    // For Test swap function 
        int x = 100;
        int y = 200;
        printf("x = %d	y = %d
    ",x,y);
        swap(&x,&y);
        printf("x = %d	y = %d
    ",x,y);
    //For Test bubble_sort function 
        bubble_sort(numbers,5);
        for (i = 0; i < 5; ++i)
        {   
            printf("%d	",numbers[i]);
    
        }   
        puts(" ");
        return 0;
    }

    结果运行正确;

    最后去掉所有无关紧要的测试代码;

    所有代码如下:

    #include <stdio.h>
    
    int cmp_int(int number_1,int number_2);
    void swap(int *number_1,int *number_2);
    void bubble_sort(int arr[],int len);
    
    int main(void)
    {
        int numbers[] = { 4,3,5,1,2 };
        int i ; 
        for (i = 0; i < 5; ++i)
        {   
            printf("%d	",numbers[i]);
    
        }   
        puts("");
        
        bubble_sort(numbers,5);
        for (i = 0; i < 5; ++i)
        {   
            printf("%d	",numbers[i]);
    
        }   
        puts(" ");
        return 0;
    }
    
    int cmp_int(int number_1,int number_2)
    {
        return number_1 > number_2 ? 1:0;
    }
    void swap(int *number_1,int *number_2)
    {
        int tmp ;
        tmp = *number_1;
        *number_1 = *number_2;
        *number_2 = tmp;
    }
    void bubble_sort(int arr[],int len)
    {
        int i,j;
        for (i = 0;i < len -1; i++)
        {   
            for (j = 0 ; j < len - 1 -i ; j++)
            {   
    
                if (cmp_int(arr[j],arr[j+1]))
                    swap(&arr[j],&arr[j+1]);
            }   
        }   
    }

    Discussion

    这只是学习如何进行整数的排序,现实遇到的问题可能是字符串,中文等等;

    我会继续总结;

    See Also

    http://baike.baidu.com/link?url=SP3b84_a5i_0bgWsWUa0NZjLh-vjyjy5f5i3UHr-ib4gVctNzSabMgpImppLfoJ92rVUu60Ef3MtxglobGWZO_

    Can we drop this masquerade
  • 相关阅读:
    在linux CentOS7 安装Nginx 部署vue
    VS Code 用Vue Cli创建项目
    CentOS8通过命令设置IP地址
    C# .net Core WebApi 系列(一)创建与使用
    JS、C#编码解码
    C#通用类库--数字转为人民币汉字大写表示
    CheckUtil类
    Windows服务用bat命令安装与卸载
    突然的兴趣,我想写一个提取图片中特定颜色图像的程序
    一些常用的基础操作记录
  • 原文地址:https://www.cnblogs.com/landpack/p/4780098.html
Copyright © 2011-2022 走看看