Chinaunix首页 | 论坛 | 博客
  • 博客访问: 899937
  • 博文数量: 119
  • 博客积分: 2493
  • 博客等级: 大尉
  • 技术积分: 2363
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-03 14:00
文章分类

全部博文(119)

文章存档

2013年(19)

2012年(100)

分类: LINUX

2012-09-15 11:15:28

一、算法思想:
<1>,扫描待排序的记录,在扫描过程中,不断地将相邻两个记录中关键字大的记录后移
 最后必然将序列中最大关键字换到记录序列的末尾。
<2>,进行下一次的扫描,对前n-1个记录进行同样的操作。其结果是使次大的记录被放在第
 n-1大的记录位置。然后转到<1>,直到n-1=1,算法结束。

算法分析:
算法共需要n-1趟。2个数需要1趟,3个数需要2趟。4个数需要3趟。...
每趟都是相邻两个数进行比较,前面的那个数的下标为[0,n-2-i],后面那个数[1,n-1-i] 其中i取值范围
[0,n-2]。
-----------------------------------------------------------------------------------------------------------
二、算法的基本实现。

  1. #define swap(a, b) \
  2.     do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)

  3. void bubble_sort(int a[], int left, int right)
  4. {
  5.      int i = 0, j = 0;
  6.      int len = right - left + 1;
  7.      int tmp = 0;
  8.     
  9.      for (i=0;i<=len-2;i++) {          //[0,n-2]共n-1趟
  10.             for (j=0;j<len-1-i;j++) //每一趟比较的范围[0,len-1-i]
  11.                 if (a[j] > a[j+1])
  12.                  swap(a[j],a[j+1]);
  13.             }
  14.      }
  15. }
---------------------------------------------------------------------------------------------------------
二,算法改进:减少不必要的趟数。
可以设置一个标志,如果在某一趟中没有出现交换,则说明前面的数据已经是顺序的了。
不需要以后的“趟”了,所以就可以结束算法了,这样可以减少不必要的趟数而提高算法的
性能。

  1. #define swap(a, b) \
  2.     do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)

  3. void bubble_sort(int a[], int left, int right)
  4. {
  5.      int i = 0, j = 0;
  6.      int len = right - left + 1;
  7.      int tmp = 0;
  8.      int change = 1;
  9.     
  10.      for (i=0;i<=len-2 && change;i++) {//[0,n-2]共n-1趟
  11.             change = 0;
  12.             for (j=0;j<len-1-i;j++) {//每一趟比较的范围[0,len-1-i]
  13.                 if (a[j] > a[j+1]) {
  14.                  swap(a[j],a[j+1]);
  15.                  change = 1;
  16.                  }
  17.             }
  18.      }
  19. }
----------------------------------------------------------------------------------------------
算法时间复杂度:
        O(n^2)

---------------------------------------------------------------------------------------------



阅读(1140) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~