首页 / 操作系统 / Linux / 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这只是学习如何进行整数的排序,现??遇到的问题可能是字符串,中文等等;我会继续总结;本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-09/122720.htm