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

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

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

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

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

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

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 i ;
    ; i < ; ++i)
    {
        printf("%d\t",numbers[i]);

    }
    puts("");

    ;
}

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

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

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

#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 i ;
    ; i < ; ++i)
    {
        printf("%d\t",numbers[i]);

    }
    puts("");

    ;
}

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;
    ;i < len -; i++)
    {
         ; j < len -  -i ; j++)
        {

            ]))
                swap(arr[j],arr[j+]);
        }
    }
}

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

首先,测试cmp_int函数:

int main(void)
{
    ,,,, };
    int i ;
    ; i < ; ++i)
    {
        printf("%d\t",numbers[i]);

    }
    puts("");

// For Test cmp_int function
    ,)){
        //if 1 > 2,return 0
        puts("Biger");
    }else{
        puts("smaller");
    }   

    ;
}

结果如下:

接下来测试,swap函数:

int main(void)
{
    ,,,, };
    int i ;
    ; i < ; ++i)
    {
        printf("%d\t",numbers[i]);

    }
    puts("");

// For Test cmp_int function
    ,)){
        //if 1 > 2,return 0
        puts("Biger");
    }else{
        puts("smaller");
    }
// For Test swap function
    ;
    ;
    printf("x = %d\ty = %d\n",x,y);
    swap(x,y);
    printf("x = %d\ty = %d\n",x,y);

    ;
}

运行结果如下:

结果并没有实现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 i ;
    ; i < ; ++i)
    {
        printf("%d\t",numbers[i]);

    }
    puts("");

// For Test cmp_int function
    ,)){
        //if 1 > 2,return 0
        puts("Biger");
    }else{
        puts("smaller");
    }
// For Test swap function
    ;
    ;
    printf("x = %d\ty = %d\n",x,y);
    swap(&x,&y);
    printf("x = %d\ty = %d\n",x,y);

    ;
}

int cmp_int(int number_1,int number_2)
{
    :;
}

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;
    ;i < len -; i++)
    {
         ; j < len -  -i ; j++)
        {

            ]))
                swap(&arr[j],&arr[j+]);
        }
    }
}

运行,结果如下:

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

接下来测试排序主函数;

int main(void)
{
    ,,,, };
    int i ;
    ; i < ; ++i)
    {
        printf("%d\t",numbers[i]);

    }
    puts("");

// For Test cmp_int function
    ,)){
        //if 1 > 2,return 0
        puts("Biger");
    }else{
        puts("smaller");
    }
// For Test swap function
    ;
    ;
    printf("x = %d\ty = %d\n",x,y);
    swap(&x,&y);
    printf("x = %d\ty = %d\n",x,y);
//For Test bubble_sort function
    bubble_sort(numbers,);
    ; i < ; ++i)
    {
        printf("%d\t",numbers[i]);

    }
    puts(" ");
    ;
}

结果运行正确;

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

所有代码如下:

#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 i ;
    ; i < ; ++i)
    {
        printf("%d\t",numbers[i]);

    }
    puts("");

    bubble_sort(numbers,);
    ; i < ; ++i)
    {
        printf("%d\t",numbers[i]);

    }
    puts(" ");
    ;
}

int cmp_int(int number_1,int number_2)
{
    :;
}
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;
    ;i < len -; i++)
    {
         ; j < len -  -i ; j++)
        {   

            ]))
                swap(&arr[j],&arr[j+]);
        }
    }
}

Discussion

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

我会继续总结;

See Also

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

C语言实现冒泡排序-整数排序的更多相关文章

  1. bitmap对海量无重复的整数排序--转

    原文地址:http://blog.csdn.net/u013074465/article/details/46956295 现在有n个无重复的正整数(n 小于10的7次方),如果内存限制在1.5M以内 ...

  2. 基于visual Studio2013解决C语言竞赛题之0710排序函数

     题目

  3. 考查SQLite 3索引对整数排序的性能影响

    做个实验,想了解SQLite3索引对整数排序的性能影响. 用这个测试表,考查绿色那列: id name date 自增型主键 字符串型,随机生成 整数型 随机生成,范围0到54354354 1 bMz ...

  4. 归并排序 &amp; 计数排序 &amp; 基数排序 &amp; 冒泡排序 &amp; 选择排序 ----&gt; 内部排序性能比较

    2.3 归并排序 接口定义: int merge(void* data, int esize, int lpos, int dpos, int rpos, int (*compare)(const v ...

  5. Swift语言指南(三)--语言基础之整数和浮点数

    原文:Swift语言指南(三)--语言基础之整数和浮点数 整数 整数指没有小数的整数,如42,-23.整数可以是有符号的(正数,零,负数),也可以是无符号的(正数,零). Swift提供了8,16,3 ...

  6. C语言实现冒泡排序法和选择排序法代码参考

    为了易用,我编写排序函数,这和直接在主调函数中用是差不多的. 我认为选择排序法更好理解!请注意 i 和 j ,在写代码时别弄错了,不然很难找到错误! 冒泡排序法 void sort(int * ar, ...

  7. 排序算法c语言描述---冒泡排序

    排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析. 文章规划: 一.通过自己对排序算法本身的理解,对每个方法写个小测试程序. 具体思路分析 ...

  8. LintCode 整数排序

    题目:给一组整数,按照升序排序,使用选择排序,冒泡排序,插入排序或者任何 O(n2) 的排序算法. 1.冒泡:从头开始,比较相邻的两个元素,大的放在后面.一轮结束之后,最大的数沉底,不参与下一轮比较. ...

  9. C语言学习之选择排序

    上一篇文章中讲C语言排序中的比较常见的(交换)冒泡排序,那么这篇文章也将以新手个人的经历来讲同样比较常见而实用的数组排序之选择排序. 选择排序,从字面上看是通过选择来进行排序.其实它的用法就是通过选择 ...

随机推荐

  1. 自定义可视化调试工具(Microsoft.VisualStudio.DebuggerVisualizers)

    前言: 最近飞机失联的太多,明天要飞北京处理服务器双机热备的问题,航空保险已买,单号是:TF10122913. 至于我的银行卡密码,在我枕头下面的字条里,要是我之后没再更新文章,请通知我家人,哈哈哈哈 ...

  2. nyoj 142, poj 1039 ,hdu 1454 管道问题

    http://acm.nyist.net/JudgeOnline/problem.php?pid=142 第一道解析几何问题,比较纠结,主要是几个解析几何的基本操作,包括求两线段的叉积,判断左右方向, ...

  3. OD使用教程12

    载入程序输入关键字: 双击进入程序 仔细看发现并没有跳转直接跳到这个mov,往上看发现retn上面有一个push,在这种编写手法当中这种组合相当于一个jmp, 跳到离它最近的一个值(在这就是004A5 ...

  4. 百度Java研发面经100题 总结

    1. 单例模式常见的应用场景分析. 在23种设计模式中,单例模式排行老大.虽然理解简单,但是对于应用场景.你真正的熟悉么?使用单例,是由于没必要每个请求都新建一个对象,这样既浪费CPU又浪费内存:之所 ...

  5. 基于分布式、服务化的maven项目文件规划

    引言 此文不是纯粹介绍maven概念,而是介绍一个具体的maven项目文件规划 这个规划可能适合于研发比较复杂的业务,这些业务有分布式和服务化的需要. 这个规划能够解决因为分布式和服务化要求而引起的项 ...

  6. js正则表达式 验证手机号,email地址和邮政编码

    手机号码的验证(13开头和158,159开头,共11位) var re;        var ss=document.getElementById('textbox3').value;        ...

  7. StoryBoard--看上去很美

    StoryBoard--看上去很美 介绍 StoryBoard 是苹果在 2011 年的 WWDC Session 309<Introducing Interface Builder Story ...

  8. JavaScript高级应用(二)(转)

    1.组件是否安装 //组件是否安装 isComponentInstalled("{6B053A4B-A7EC-4D3D-4567-B8FF8A1A5739}", "com ...

  9. SQL convert datetime

    格式: CONVERT(data_type,expression[,style]) 说明: 此样式一般在时间类型(datetime,smalldatetime)与字符串类型(nchar,nvarcha ...

  10. python-RabbitMQ基础篇

    一.RabbitMQ简单介绍 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue,  ...