冒泡排序
冒泡排序(BubbleSort)也被称为气泡排序,是一种典型的交换排序方法。记得在大一上C语言课程的时候,老师形容它的基本思想就是通过无序区中相邻元素关键字间的比较和位置的交换使关键字最小的元素如同气泡一般咕嘟咕嘟往上“漂浮”直到“水面”。当时只是一笑了之,也没有仔细的去思考,现在决定好好思考一下,并且把过程记录下来。
整个算法从最下面的元素开始,对每两个相邻的关键字进行比较,且使关键字较小的元素换至关键字较大的元素之上,使得经过一趟冒泡排序之后关键字最小的元素到达最上端。接着,在剩下的元素中找关键字次小的元素,然后把它换到第二个位置上面。依此类推,直到所有元素都有序为止。
我们先来看一下整个冒泡算法:
void BubbleSort(int data[],int n) { int i,j,temp; bool exchange; //定义一个标记来判断整个序列是否已经有序 for( i=0;i<n-1;i++) //每趟i循环将最大(小)值固定到最后一位 { exchange=false; for(int j=0;j<n-i-1;j++) { if(data[j]>data[j+1]) { temp = data[j]; data[j]=data[j+1]; data[j+1]=temp; exchange=true; } } if(!exchange) //未发生交换则说明数组已有序,无需再继续交换。 break; } }
通俗的来讲:整个冒泡排序就是通过两次循环,外层循环将此轮最大(小)的值固定在此轮尾部,内部循环“冒泡”比较相邻的两个元素并决定是否进行交换。
下面我们都过完整的代码来看一下它的排序是否正确:
#include<stdio.h> void BubbleSort(int data[],int n) { int i,j,temp; bool exchange; //定义一个标记来判断整个序列是否已经有序 for( i=0;i<n-1;i++) //每趟i循环将最大(小)值固定到最后一位 { exchange=false; for(int j=0;j<n-i-1;j++) { if(data[j]>data[j+1]) { temp = data[j]; data[j]=data[j+1]; data[j+1]=temp; exchange=true; } } if(!exchange) //未发生交换则说明数组已有序,无需再继续交换。 break; } } int main() { int i; int data[]={45,743,13,54,35,12,333,124,4,9}; int n = (int)(sizeof(data)/sizeof(*data)); //算出数组长度 printf("排序前数组:\n"); for(i=0;i<n;i++) { printf("%d ",data[i]); } BubbleSort(data,n); printf("\n排序后数组:\n"); for(i=0;i<n;i++) { printf("%d ",data[i]); } printf("\n"); return 0; }
我们来看一下运行结果:
可以看出是能够输出排序结果的。
看一下它的时间复杂度:
平均时间复杂度 | 最好时间复杂度 | 最坏时间复杂度 |
O2 | O | O2 |
另外注意一点:
冒泡排序每趟产生的有序区一定是全局有序区,也就是说它每趟产生的有序区中的所有元素都归位了。
——宁愿做过了后悔,也不要错过了后悔。加油!