冒泡排序法的优化
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写的代码也是此种优化:
/*随机产生10个10~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;//k为0,标记没有交换
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;
}
关于冒泡法,还可以参阅专项文章:
以上是关于冒泡排序法的优化的主要内容,如果未能解决你的问题,请参考以下文章