冒泡排序思想:依次比较相邻的两个数,将较小的数放在前面,较大的数放在后面(相当于气泡上升,因此称为冒泡排序)
冒泡排序的算法稳定,时间复杂度为O(n)^2
冒泡排序图解:
// 23 12 34 22 9
// i j array[j - 1] > array[j] 交换
// 12 23 34 22 9
// i j array[j - 1] < array[j] 不交换
// 12 23 34 22 9
// i j array[j - 1] > array[j] 交换
// 12 23 22 34 9
// i j array[j - 1] > array[j] 交换
// 12 23 22 9 34 得到第一个最大的元素34
// 至此第一轮比较完成
// 12 23 22 9 34
// ij array[j - 1] < array[j] 不交换
// 12 23 22 9 34
// i j array[j - 1] > array[j] 交换
// 12 22 23 9 34
// i j array[j - 1] > array[j] 交换
// 12 22 9 23 34 得到第二大元素
// 至此第二轮比较完成
// 12 22 9 23 34
// j i array[j - 1] < array[j] 不交换
// 12 22 9 23 34
// ij array[j - 1] > array[j] 交换
// 12 9 22 23 34 得到第三大元素
// 至此第三轮比较完成
// 12 9 22 23 34
// j i array[j - 1] > array[j] 交换
// 9 12 22 23 34 得到第四大元素
// 至此比较完成
冒泡排序的代码:
void bubble_sort1(int *array, int length) //冒泡排序
{
int i = 0;
int j = 0;
int temp = 0;
for(i = 0; i < length -1; ++i){
for(j = 1; j < length - i; ++j){
if(array[j - 1] > array[j]){
temp = array[j - 1];
array[j - 1] = array[j];
array[j] = temp;
}
}
}
}
优化的冒泡排序:
给出一个标记,用来标记每轮比较结束后是否发生交换,若没有发生交换说明序列已经有序
void bubble_sort2(int *array, int length) //优化的冒泡排序
{
int i = 0;
int temp = 0;
Boolean flag = TRUE; //标记,为TRUE时说明有交换,否则没有交换
while(flag){ //上一轮是否出现交换过程
flag = FALSE; //每一轮的初始都是没有交换的
for(j = 1; j < length; ++j){
if(array[j - 1] > array[j]){
temp = array[j - 1];
array[j - 1] = array[j];
array[j] = temp;
flag = TRUE;
}
}
length--;
}
}