冒泡排序法的优化

Posted 阿硃C语言学习c程序

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序法的优化相关的知识,希望对你有一定的参考价值。

冒泡法排序的基本思想,以升序排序为例:从后向前,总是相邻两元素两两比较,小的数“冒”到前面,大的数“沉”到“底下”。

冒泡排序法的优化

将六个数3,9,4,6,7,1按由小到大的顺序排列起来。

基本程序:

#include<stdio.h>//冒泡法排序(从小到大)

#define N 6

int main()

{

int i,j,k,a[N]={3,9,4,6,7,1};

printf("排序前 ");

for(i=0;i<N;i++)

    printf("%d ",a[i]);

/*外循环N-1轮*/

for(i=N-1;i>0;i--)/* i初值为最大下标,实际终值为第2小下标*/

    for(j=N-1;j>N-1-i;j--)/*从后向前,小的数冒到前面。(i取最后一个值时,要保证内循环是一次)*/

        if(a[j]<a[j-1])

           {k=a[j];a[j]=a[j-1];a[j-1]=k;}

printf(" 排序后: ");

for(i=0;i<=N-1;i++)

    printf("%d ",a[i]);

return 0;

}

冒泡排序法的优化

优化方案:

如果内循环一趟比较完后, if(a[j]<a[j-1])始终没有成立,即没有发生元素交换,说明数组已经有序了,也就不需要再进行外循环了。所以这种情况下可以提前退出外循环。

优化后的代码:

#include<stdio.h>//冒泡法排序(从小到大)

#define N 6

int main()

{

int i,j,k,a[N]={3,9,4,6,7,1};

int flag;

printf("排序前 ");

for(i=0;i<N;i++)

    printf("%d ",a[i]);

/*外循环N-1轮*/

for(i=N-1;i>0;i--)/* i初值为最大下标,实际终值为第2小下标*/

     {flag=0;

      for(j=N-1;j>N-1-i;j--)/*从后向前,小的数冒到前面。(i取最后一个值时,要保证内循环是一次)*/

            if(a[j]<a[j-1])

               {k=a[j];a[j]=a[j-1];a[j-1]=k;

                flag=1;//有交换

                }

 if(flag==0) break;//无交换,提前退出外循环

}

printf(" 排序后: ");

for(i=0;i<=N-1;i++)

    printf("%d ",a[i]);

return 0;

}

以下用do……while写的代码也是此种优化:

/*随机产生1010~99间的整数,用改进冒泡法作升序排序*/

#include <stdio.h>

#include <time.h>

#include <stdlib.h>

#define N 10

int main()

{

int j,k,jmax,temp,a[N];

srand((unsigned)time(NULL));

for(j=0;j<N;j++)

    printf("%d ",a[j]=rand()%90+10);

jmax=N-1;

do

{

    k=0;//k0,标记没有交换

    for(j=0;j<jmax;j++)

        if(a[j]>a[j+1])

           {

             temp=a[j];

             a[j]=a[j+1];

             a[j+1]=temp;

             k++;

            }

      jmax=jmax-1;

}while(jmax>=0&&k);//

for(j=0;j<N;j++)

     printf("%d ",a[j]);

return 0;

}


关于冒泡法,还可以参阅专项文章:



以上是关于冒泡排序法的优化的主要内容,如果未能解决你的问题,请参考以下文章

冒泡排序法的十六种写法

八大数据排序法冒泡排序法的图形理解和案例实现 | C++

VBA: 冒泡排序法的代码实现

976. 三角形的最大周长(冒泡排序法的活用)

冒泡排序法三部曲终极版の最优的冒泡排序算法

冒泡法的实例(给数组排序)