搜索
查看: 1580|回复: 3
打印 上一主题 下一主题

改进的冒泡排序

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-11 02:09:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <stdio.h>

  2. void swap(int*, int*);
  3. void bubble_sort(int*, int);

  4. int main()
  5. {
  6.         int data[5] = {3, 7, 4, 1, 9};
  7.         int i;
  8.         bubble_sort(data, 5);

  9.         for(i=0; i!=5; ++i)
  10.                 printf("%d ", data[i]);

  11.         return 0;
  12. }

  13. void swap(int* a, int* b)
  14. {
  15.         int temp = *a;
  16.         *a = *b;
  17.         *b = temp;
  18. }

  19. void bubble_sort(int* ary, int length)
  20. {
  21.         int i, j;
  22.         int changed;

  23.         for(i=0; i<length-1 && changed; ++i){
  24.                 changed = 0;
  25.                 for(j=0; j<length-i; ++j)
  26.                         if(ary[j] > ary[j+1]){
  27.                                 changed = 1;
  28.                                 swap(&ary[j], &ary[j+1]);
  29.                         }
  30.         }
  31. }
复制代码


一句话简介:用一个变量(changed)来记录在某一轮比较中有没有发生交换,如果没有,那么排序已经完成

很明显,如果一个数组的a[1] < a[2] a[2] < a[3] ....都成立,那么这个数组就是排好序的

如果要用冒泡排序,强烈建议加上这个判断,否则冒泡排序就要和选择排序做同样次数的比较,而且由于选择排序少的缘故,必然是选择排序比较好。
另外,选择排序要比冒泡排序稍微好写一点

后面的实际例子也是如此,人名是个字符串,一般占的内存较多,让两个占很大内存空间的结构体进行交换是比较低效的事情。
有两种解决方法,第一是给每个人编号,然后实际排序的结构体中记录人的编号和分数,例如

编号 人名
0 huhu
1 haha
2 xixi
3 hengheng
4 gaoshou

然后结构体中的数据是
0 5 (对应huhu 5)
1 3 (对应haha 3)
2 5
3 2
4 8

这样保证排序进行交换的时候只交换8个字节的数据,然后输出的时候再根据编号输出人名

另外一种方法是结构体中保存分数和姓名字符串的指针,这样保证每次交换的时候只有8字节或12字节(64位系统)
可以试着自己研究一下
推荐
发表于 2015-7-10 19:25:47 | 只看该作者
给每个人编号来提高交换效率,比较简单实用
沙发
发表于 2015-3-4 13:20:10 | 只看该作者
经常把选择排序当成冒泡来写,当必须写冒泡时,写不出来了
地板
发表于 2015-11-20 20:25:19 | 只看该作者
{:soso_e121:}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表