词条 | 起泡法 |
释义 | 起泡法是从一端开始比较的,第一次循环就是把最大数放到最后一个位置,第二次循环就是把第二最大数放到倒数第二位置。整个过程就像烧开水一样,较小值像水中的气泡一样逐趟往上冒,每一趟都有一块“最大”的石头沉到水底。如此循环实现数据的排序。下面举一个用起泡法对n个数字进行排序的例子: #include<stdio.h> void main() { int a[100]; int n,i,j,t; printf("请输入要排序的数字个数:"); scanf("%d",&n); printf("请输入各个数字:"); for(i=0;i<n;i++) scanf("%d",&a[i]); printf("\"); for(j=0;j<(n-1);j++) /*进行n-1次循环,实现n-1趟比较*/ for(i=0;i<(n-1-j);i++) /*在每一趟中进行n-1-j次比较*/ if(a[i]>a[i+1]) /*相邻两个数比较*/ {t=a[i];a[i]=a[i+1];a[i+1]=t;} printf("经过排序后的数字为:"); for(i=0;i<n;i++) printf("%d ",a[i]); printf("\"); } 那么我们是否可以找到最小数的同时找到最大数呢?当然可以。方法是在一端起泡时同时在另一端也进行起泡。即反向起泡。下面的程序段实现的是双向起泡: void Bubble2Sort(int* pData,int Count) { int iTemp; int left = 1; int right =Count -1; int t; do { //正向的部分 for(int i=right;i>=left;i--) { if(pData { iTemp = pData; pData = pData[i-1]; pData[i-1] = iTemp; t = i; } } left = t+1; //反向的部分 for(i=left;i { if(pData { iTemp = pData; pData = pData[i-1]; pData[i-1] = iTemp; t = i; } } right = t-1; }while(left<=right); } 分析上面的程序段我们可以发现正向起泡时第一次循环找出了最小数,反向起泡第一次循环找到最大数。很显然在一次循环中即可以找到一个最小的数还可以找到一个最大的数,所以用双向冒泡排序的交换的次数减少了,从而达到了优化起泡法的作用。 |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。