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

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

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

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

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

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

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

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

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

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

#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[] = { ,,,, };
int i ;
for (i = ; i < ; ++i)
{
printf("%d\t",numbers[i]); }
puts(""); return ;
} 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 = ;i < len -; i++)
{
for (j = ; j < len - -i ; j++)
{ if (cmp_int(arr[j],arr[j+]))
swap(arr[j],arr[j+]);
}
}
}

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

首先,测试cmp_int函数:

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

结果如下:

接下来测试,swap函数:

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

运行结果如下:

结果并没有实现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[] = { ,,,, };
int i ;
for (i = ; i < ; ++i)
{
printf("%d\t",numbers[i]); }
puts(""); // For Test cmp_int function
if (cmp_int(,)){
//if 1 > 2,return 0
puts("Biger");
}else{
puts("smaller");
}
// For Test swap function
int x = ;
int y = ;
printf("x = %d\ty = %d\n",x,y);
swap(&x,&y);
printf("x = %d\ty = %d\n",x,y); return ;
} int cmp_int(int number_1,int number_2)
{
return number_1 > 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;
for (i = ;i < len -; i++)
{
for (j = ; j < len - -i ; j++)
{ if (cmp_int(arr[j],arr[j+]))
swap(&arr[j],&arr[j+]);
}
}
}

运行,结果如下:

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

接下来测试排序主函数;

int main(void)
{
int numbers[] = { ,,,, };
int i ;
for (i = ; i < ; ++i)
{
printf("%d\t",numbers[i]); }
puts(""); // For Test cmp_int function
if (cmp_int(,)){
//if 1 > 2,return 0
puts("Biger");
}else{
puts("smaller");
}
// For Test swap function
int x = ;
int y = ;
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,);
for (i = ; i < ; ++i)
{
printf("%d\t",numbers[i]); }
puts(" ");
return ;
}

结果运行正确;

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

所有代码如下:

#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[] = { ,,,, };
int i ;
for (i = ; i < ; ++i)
{
printf("%d\t",numbers[i]); }
puts(""); bubble_sort(numbers,);
for (i = ; i < ; ++i)
{
printf("%d\t",numbers[i]); }
puts(" ");
return ;
} int cmp_int(int number_1,int number_2)
{
return number_1 > 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;
for (i = ;i < len -; i++)
{
for (j = ; j < len - -i ; j++)
{ if (cmp_int(arr[j],arr[j+]))
swap(&arr[j],&arr[j+]);
}
}
}

Discussion

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

我会继续总结;

See Also

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

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

  1. C语言实现 冒泡排序 选择排序 希尔排序

    // 冒泡排序 // 选择排序 // 希尔排序 // 快速排序 // 递归排序 // 堆排序 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h& ...

  2. YTU 2427: C语言习题 整数排序

    2427: C语言习题 整数排序 时间限制: 1 Sec  内存限制: 128 MB 提交: 391  解决: 282 题目描述 用指向指针的指针的方法对n个整数排序并输出.要求将排序单独写成一个函数 ...

  3. C语言之冒泡排序、选择排序、折半查询、进制查表

    菜单导航 1.冒泡排序 2.选择排序 3.折半查询 4.进制查表(十进制转二进制.八进制.十六进制) 一.冒泡排序 //1.冒泡排序 /** 一组无序数字,进行从小到大排序 冒泡排序的过程:就是每个循 ...

  4. C语言:10个整数排序(别忘了负数)

    题目内容: 10个整数排序(别忘了负数) 例如 input 1 0 2 0 3 4 1 9 8 7 output 0 0 1 1 2 3 4 7 8 9 编码: void sort(int *a); ...

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

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

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

     题目

  7. C语言8大经典排序算法(1)

    算法一直是编程的基础,而排序算法是学习算法的开始,排序也是数据处理的重要内容.所谓排序是指将一个无序列整理成按非递减顺序排列的有序序列.排列的方法有很多,根据待排序序列的规模以及对数据的处理的要求,可 ...

  8. C语言实现九大排序算法

    C语言实现九大排序算法 直接插入排序 折半插入排序 希尔排序 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 基数排序 C语言实现九大排序算法 直接插入排序 将数组分为两个部分,一个是有序部分,一 ...

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

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

随机推荐

  1. mysql事务处理用法与实例详解

    来源:转载  MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关1.MyISAM:不支持事务,用于只读程序提高性能 2.InnoDB:支持ACID事务.行级锁.并发 3.Berke ...

  2. Prim算法和Kruskal算法(图论中的最小生成树算法)

    最小生成树在一个图中可以有多个,但是如果一个图中边的权值互不相同的话,那么最小生成树只可能存在一个,用反证法很容易就证明出来了. 当然最小生成树也是一个图中包含所有节点的权值和最低的子图. 在一个图中 ...

  3. 如何在其他电脑上运行VS2005编译的DEBUG版应用程序

    做项目的过程中,遇到这样的问题:在自己的电脑上用VS2005编译好的DEBUG版程序在其它的没有安装VS2005的电脑上没有办法运行,郁闷至极啊. 直 接拷贝文件后,错误信息如下:"This ...

  4. Antenna Placement poj 3020(匹配)

    http://poj.org/problem?id=3020 题意:给定一个n*m的矩阵,'*'代表城市,现在想要用1*2的矩阵将所有的城市覆盖,问最少需要多少个矩阵? 分析:先为每个城市进行标号,再 ...

  5. PHP 常用字符串函数整理

    PHP语言中的字符串函数也是一个比较易懂的知识.今天我们就为大家总结了将近12种PHP字符串函数,希望对又需要的朋友有所帮助,增加读者朋友的PHP知识库. 1.查找字符位置函数 strpos($str ...

  6. SWT, JFace必须的jar包和有可能会用到的jar

    先附上一篇转载的, 转自CSDN, 原文地址:http://blog.csdn.net/nabber/article/details/1879511 如果阁下看到了这篇文章,估计你已经碰到了这样的困那 ...

  7. [python] 线程简介

    参考:http://www.cnblogs.com/aylin/p/5601969.html 我是搬运工,特别感谢张岩林老师! python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件 ...

  8. iOS 开发线程 gcd

      基础知识: 下午9:09 一.基础概念 1.什么是GCD 全称是Grand Central Dispath 纯C语言编写,提供非常多且强大的函数,是目前推荐的多线程开发方法,NSOperation ...

  9. css3之background-clip与background-origin的区别

    background-clip 规定背景的绘制区域. 3 background-origin 规定背景图片的定位区域. 3 background-size 规定背景图片的尺寸. 3 backgroun ...

  10. 反射中通过class标记来获取字段及方法

    //这是通过class标记获取字段的代码 Field[] fields= classzz.getDeclaredFields(); //获取该class标记的表名代码,必须为,getSimpleNam ...