冒泡排序是我在排序学习中学到的第一种排序算法,也是一种相对简单但是效率相对低下的排序算法。
言归正传,什么是冒泡排序?
在一串没有经过排序的数字中,从头(尾)起,依次向另一端进行排序。
假设要对一串无序数组进行从大到小的排序,我们可以从后往前依次比较相邻的两个数,如果后面那个数大于前面那个数字,就将这两个数交换,直到做到整个数组的第一个数字为止,因此第一个数字便是我们在整个数组中所得到的最大数字。
对于第二次排序,我们仍然重复以上步骤,但是我们只要做到整个数组的第二个数字即可(因为第一次排序将整个数组的最大的元素放置于数组之首,第二次从数组末尾冒泡到数组的第二个元素,可获得第二大的元素并将其放置于数组的第二个位置)...依次类推直到整个数组从大到小排列。
演示:
未排序数组: 8 11 25 6 3 7 10 5
第一次排序后:25 8 11 10 6 3 7 5
第二次排序后:25 11 8 10 7 6 3 5
第三次排序后:25 11 10 8 7 6 5 3
第四次排序后:25 11 10 8 7 6 5 3
第五次排序后:25 11 10 8 7 6 5 3
第六次排序后:25 11 10 8 7 6 5 3
第七次排序后:25 11 10 8 7 6 5 3
其实我们可以发现,这串数组仅仅经过了三次排序,变达到了从大到小排列的目的,但是并不是每个数组都是如此,在最坏的情况下,对n个元素的数组进行排序,我们需要进行(n-1)次排序。
代码演示:
#include <stdio.h>
void bubble(int a[]);
int main(int argc, const char * argv[]) {
int a[8]; //a为待排序数组,共有八个元素
printf("Enter 8 numbers:");
for(int i = 0; i<8; i++){
scanf("%d",&a[i]);
}
bubble(a);
for(int i = 0;i<8; i++){
printf("%d ",a[i]);
}
return 0;
}
void bubble(int a[]){ //对数组进行冒泡排序
for(int i = 0; i<8; i++){
for(int j = 7; j>i; j--){
if(a[j]>a[j-1]){ //对相邻数字进行换数操作
int t = a[j];
a[j] = a[j-1];
a[j-1] = t;
}
}
}
}
冒泡排序法从效率上来讲并不是很高,实际需要的排序时间也很长,特别是在数据量很大情况下更是耗费时间。