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\t",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\t",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\t",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\t",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\ty = %d\n",x,y);
    swap(x,y);
    printf("x = %d\ty = %d\n",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\t",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\ty = %d\n",x,y);
    swap(&x,&y);
    printf("x = %d\ty = %d\n",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\t",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\ty = %d\n",x,y);
    swap(&x,&y);
    printf("x = %d\ty = %d\n",x,y);
//For Test bubble_sort function
    bubble_sort(numbers,5);
    for (i = 0; i < 5; ++i)
    {
        printf("%d\t",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\t",numbers[i]);

    }
    puts("");

    bubble_sort(numbers,5);
    for (i = 0; i < 5; ++i)
    {
        printf("%d\t",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_

时间: 2024-08-10 23:26:19

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

排序算法详解(Go语言实现):冒泡排序/选择排序/快速排序/插入排序

算法是程序的灵魂,而排序算法则是一种最基本的算法.排序算法有许多种,本文介绍4中排序算法:冒泡排序,选择排序,快速排序和插入排序,以从小到大为例. 一.冒泡排序 冒泡排序的原理是,对给定的数组进行多次遍历,每次均比较相邻的两个数,如果前一个比后一个大,则交换这两个数.经过第一次遍历之后,最大的数就在最右侧了:第二次遍历之后,第二大的数就在右数第二个位置了:以此类推. //冒泡排序(排序10000个随机整数,用时约145ms) func bubbleSort(nums []int) { for i

C/C++算法竞赛入门经典Page11 例题1-5 三整数排序

题目:输入3个整数,从小到大排序后输出 样例输入: 20 7 33 样例输出: 7 20 33 首先,先声明三个整数a,b,c和一个临时变量t: int a,b,c,t;//1,b,c为三个整数,t为临时变量 输入三个整数: scanf("%d%d%d",&a,&b,&c); 进行3次if判断: 1.如果b>a,则a,b对调 2.如果c>a,则a,c对调 3.如果c>b,则b,c对调 代码: if(b>=a){ t=b; b=a; a=t

插入排序 | 冒泡排序 | 希尔排序 | 堆排序 | 快速排序 | 选择排序 | 归并排序

以下是最近学习各种算法的代码实现: #include <stdlib.h> #include <stdio.h> #include <time.h> #include <limits.h> typedef int EleType; typedef int (*CompFunc)(void *,void *); int IntComp(void * a,void *b) { if(*(int *)a > *(int *)b) return 1; if(*

sort()使整数排序

sort()方法可将数组升序排序,但它是把数组的值转化为字符串后在排序的, 如 var a = [1,12,3,8,123] a.sort()  结果 1,12,123,3,8 和我们想要的结果不一样,解决方法, function compare(value1, value2) { return value1 - value2; } var values = [1,12,3,8,123]; values.sort(compare); alert(values); //1,3,8,12,123 如

1487 大批整数排序

个人博客:doubleq.win 1487 大批整数排序 时间限制: 3 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description !!!CodeVS开发者有话说: codevs自从换了评测机,新评测机的内存计算机制发生变化 计算内存的时候会包括栈空间 swap空间 这题的2M是单指内存空间... 十分十分抱歉 抱歉 !!! 现在有一大批(总数不超过10000000个)1到10之间的整数,现在请你从小到大进行排序输出. (测试数据将超过11MB.)

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

整数 整数指没有小数的整数,如42,-23.整数可以是有符号的(正数,零,负数),也可以是无符号的(正数,零). Swift提供了8,16,32,64位形式的有符号和无符号的整数,这些整数遵循与C语言相似的命名规则.如8位无符号整数的类型为UInt8,32位有符号整数的类型为Int32,和Swift语言的其它类型一样,这些整型命名以大写字母开头. 整数的边界 你可以通过min或max属性为每一个整数类型指定一个最小值或最大值: 1 let 最小值 = UInt8.min // 最小值 等于 0,

直接插入排序&&冒泡排序&&希尔排序(缩小增量排序)源码

public class DirectRank { public static void main(String[] args) { DirectRank aa=new DirectRank(); try { aa.judge(args); } catch (TestDefinException e2) { e2.printStackTrace(); } Integer[] a=new Integer[args.length]; try{for(int i=0;i<args.length;i++

C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序

以下列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序,然后是測试的样例.代码位置:http://download.csdn.net/detail/luozuolincool/8040027 排序类: public class Sortings { //插入排序 public void insertSort(int[] array) { int temp = 0; int index = 0; for (int i = 0; i <

C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序

下面列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序,然后是测试的例子.代码位置:http://download.csdn.net/detail/luozuolincool/8040027 排序类: public class Sortings { //插入排序 public void insertSort(int[] array) { int temp = 0; int index = 0; for (int i = 0; i <