冒泡法排序:
改进之处:n个元素比较n-1趟,第i趟比较n-i次
若在其中的某一趟排序中:若始终未发生元素的交换说明已经排序号好,函数结束!
#include<stdio.h>
#include<time.h> //clock函数
#define REPEAT 1E8 //函数重复执行次数
typedef int ElemType;
void bubble_sort1(ElemType array[],int n)
{
ElemType temp;
for(int i=0;i<n-1;++i)//比较n-1趟
{
int flag = 0;//标志位:一趟排序中是否发生了交换
for(int j=0;j<n-i-1;++j)//第j趟排序比较n-j次(j从0开始的所以还得减-1)n-j-1
{
if(array[j] < array[j+1])
{
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
flag = 1;//此趟排序中发生了交换,若未发生交换,表明已经有序
}
}
if(flag == 0)//一趟排序中未发生交换,说明已经有序,函数结束!
break;
}
}
void bubble_sort2(ElemType array[],int n)
{
ElemType temp;
for(int i=0;i<n-1;++i)//比较n-1趟
{
// int flag = 0;//标志位:一趟排序中是否发生了交换
for(int j=0;j<n-i-1;++j)//第j趟排序比较n-j次(j从0开始的所以还得减-1)n-j-1
{
if(array[j] < array[j+1])
{
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
// flag = 1;//此趟排序中发生了交换,若未发生交换,表明已经有序
}
}
// if(flag == 0)//一趟排序中未发生交换,说明已经有序,函数结束!
// break;
}
}
int main()
{
clock_t start;
clock_t end;
double duration;
ElemType array[] = {60,50,40};
int n = sizeof(array)/sizeof(array[0]);//数组元素个数
start = clock();
for(int i=0;i<REPEAT;++i)
{
bubble_sort1(array,n);
}
end = clock();
duration = (double)(end-start)/CLOCKS_PER_SEC;//函数重复执行REPEAT次所用时间
printf("%6.2e\n",duration);
for(i=0;i<n;++i)
{
printf("%d\n",array[i]);
}
return 0;
}
测试第二个函数所用时间:(不带状态标志位)
start = clock();
for(int i=0;i<REPEAT;++i)
{
bubble_sort2(array,n);
}
end = clock();
由执行结果可知,第一个函数执行效率高(带有状态标志位)
所以,以后写冒泡排序时,带上状态标志位!!!!