Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1562201
  • 博文数量: 327
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 3556
  • 用 户 组: 普通用户
  • 注册时间: 2005-04-05 21:28
个人简介

东黑布衣,流浪幽燕。 真诚善良,值得信赖。

文章分类

全部博文(327)

我的朋友

分类: BSD

2016-11-24 10:51:26

观察:
有序序列中, 任意一对相邻元素顺序,
无序序列中, 至少一对相邻元素逆序.
而冒泡法的基本思想就是消除紧邻的逆序元素,方法就是交换.
如果整趟扫描都没有交换,则排序完成.


Codebegin

  1. /*
  2. 起泡排序 观察:
  3. 在有序序列中, 任意一对相邻元素顺序,
  4. 在无序序列中, 至少一对相邻元素逆序.
  5. 而冒泡法的基本思想就是消除紧邻的逆序元素,方法就是交换.
  6. 方法:依次比较每一对相邻元素,如有必要交换之
  7. 如果整趟扫描都没有交换,则排序完成;否则,再做一趟扫描交换.
  8. */

  9. #include "stdafx.h"
  10. #include <stdio.h>

  11. void swap(int *a, int *b)
  12. {
  13.    int t;
  14.    t=*a;
  15.    *a=*b;
  16.    *b=t;
  17. }

  18. void bubble00(int a[],int N)/*基本算法*/
  19. {
  20.    int i,j,t;
  21.    for(i=0;i<N-1;i++)/* 外層循環只是保證N-1趟處理, 而且是最多N-1趟*/
  22.    {
  23.       for(j=1;j<=N-1-i;j++)/*j<=N-1-i*/
  24.       { /*每趟结束都会有一个值放到正确位置,所以j的右界是不断缩小的 */
  25.          if(a[j-1]>a[j])
  26.          { t=a[j-1]; a[j-1]=a[j]; a[j]=t; }
  27.       }
  28.    }
  29. }

  30. /*
  31. 不变性:经过k轮扫描交换后,最大的k个元素必然就位
  32. 单调性:经过k轮扫描交换后,问题的规模缩减至n-k
  33. 正确性:经至多n轮扫描后,算法必然终止,且给出正确解答
  34. */
  35. void bubble01(int a[],int N)
  36. {
  37.    int sorted;
  38.    int i;
  39.    do{
  40.       sorted=1;
  41.       for(i=1;i<N;i++){
  42.          if(a[i-1]>a[i]){
  43.             swap(&a[i-1],&a[i]);
  44.             sorted=0;
  45.          }
  46.       }
  47.       N-=1;
  48.    }while(0==sorted);
  49. }

  50. void bubble02(int a[],int n)
  51. {
  52.    int i, j;
  53.    int flag;/* 改进 */
  54.    for(i = 0; i < n-1; ++i)/* 此处的++i 和 i++ 没有区别 */
  55.    {
  56.       flag = 1;/* 改进 */
  57.       for(j = 0; j < n-i-1; ++j)
  58.       {
  59.          if(a[j] > a[j+1]) /* 升序排列 */
  60.          {
  61.             a[j] = a[j+1] ^ a[j];
  62.             a[j+1] = a[j+1] ^ a[j];
  63.             a[j] = a[j+1] ^ a[j];
  64.             flag = 0;/* 改进 */
  65.          }
  66.       }
  67.       if(1 == flag)/* 改进 : 此次遍历没有一次交换,说明顺序已经排好 */
  68.          break;
  69.     }
  70. }

  71. void bubble03(int a[],int N)/*交換狀態*/
  72. {
  73.    int j,t;
  74.    int flag=1;
  75.    int k=N-1;
  76.    while(flag==1)/*當不再發生交換,說明已經排好序*/
  77.    {
  78.       flag=0;
  79.       for(j=1;j<=k;j++)
  80.       {
  81.          if(a[j-1]>a[j])
  82.          {
  83.             t=a[j-1];
  84.             a[j-1]=a[j];
  85.             a[j]=t;
  86.             flag=1;
  87.          }
  88.       }
  89.       k-=1;
  90.    }
  91. }

  92. void bubble04(int a[], int n)
  93. {
  94.    int j, k;
  95.    int right;
  96.      
  97.    right = n;
  98.    while (right > 0)
  99.    {
  100.       k = right;
  101.       right = 0;
  102.       for (j = 1; j < k; j++)
  103.          if (a[j - 1] > a[j])
  104.          {
  105.             swap(&a[j - 1], &a[j]);
  106.             right = j;
  107.          }
  108.    }
  109. }

  110. void bubble05(int a[],int N)/*記錄現場*/
  111. {
  112.    int j,m,t;
  113.    int bound=N-1;
  114.    while(bound)
  115.    {
  116.       m=0;
  117.       for(j=1;j<=bound;j++)
  118.       {
  119.          if(a[j-1]>a[j])
  120.          {
  121.             t=a[j-1];
  122.             a[j-1]=a[j];
  123.             a[j]=t;
  124.             m=j-1;
  125.          }
  126.       }
  127.       bound=m;
  128.    }
  129. }

  130. void bubble06(int a[],int N)/*雙向冒泡*/
  131. {
  132.    int lbound=0;
  133.    int rbound=N-1;
  134.    int min,max,j,t;
  135.    while(lbound<rbound)
  136.    {
  137.       min=0;
  138.       max=0;
  139.       for(j=lbound;j<rbound;j++)/*j+1<=rbound*/
  140.       {
  141.          if(a[j]>a[j+1])
  142.          {
  143.             t=a[j];
  144.             a[j]=a[j+1];
  145.             a[j+1]=t;
  146.             max=j;
  147.          }
  148.       }
  149.       if(max==0)/*值沒變,說明沒有發生交換,數組已經有序,直接退出循環*/
  150.          break;
  151.       rbound=max;
  152.       for(j=rbound;j>lbound;j--)/*j-1>=lbound*/
  153.       {
  154.          if(a[j]<a[j-1])
  155.          {
  156.             t=a[j];
  157.             a[j]=a[j-1];
  158.             a[j-1]=t;
  159.             min=j;
  160.          }
  161.       }
  162.       if(min==0)/*值沒變,說明沒有發生交換,數組已經有序,直接退出循環*/
  163.          break;
  164.       lbound=min;
  165.    }
  166. }
  167. int main(int argc, char* argv[])
  168. {
  169.    int i;
  170.    int N;
  171.    int a[10];
  172.    if(NULL==freopen("bubblei.txt","r",stdin)){
  173.       printf("Failed to open file\n");
  174.       return -1;
  175.    }
  176.    scanf("%d",&N);
  177.    for(i=0;i<=N-1;i++)
  178.       scanf("%d",&a[i]);

  179.    bubble01(a,N);

  180.    for(i=0;i<=N-1;i++)
  181.       printf("%d ",a[i]);
  182.     return 0;
  183. }

  184. /*
  185. 10
  186. 8 100 50 22 15 6 1 1000 999 0
  187. */


Codeend
阅读(1832) | 评论(1) | 转发(0) |
0

上一篇:[20161116 ADV] Line Stone

下一篇:跑過2017

给主人留下些什么吧!~~

ZHLN2018-03-22 23:08:54

冒泡法排序
交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
     应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。


<1>, 比较第1个和第2个元素,若为逆序则交换; 然后比较第2个和第3个, 为逆序则交换;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡结束,结果最大数被安排在最后位置上.
<2>, 对前n-1个数进行第2趟排序,结果次大的数被排在第n-1个元素的位置
<3>, 重复上述过程.