改进版冒泡排序

来源:互联网 发布:mysql bool 编辑:程序博客网 时间:2024/06/05 18:50

冒泡法排序:

改进之处: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();


由执行结果可知,第一个函数执行效率高(带有状态标志位)

所以,以后写冒泡排序时,带上状态标志位!!!!

0 0