冒泡法排序:
改进之处: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();
由执行结果可知,第一个函数执行效率高(带有状态标志位)
所以,以后写冒泡排序时,带上状态标志位!!!!
原文地址:http://blog.csdn.net/zongyinhu/article/details/45288337