冒泡排序简介
冒泡排序的基本操作就是将重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,时间复杂度为O(n^2)。
冒泡排序的模拟过程可以看链接:BubbleSortion
实现过程
为了比较容易地理解冒泡排序,我们可以列出一组数据,比如:
5,6,4
我列出了两种方法分别说明插入排序的实现过程,你可以选择自己喜欢的方法:
第一种
对于冒泡排序算法来说:
1. 第一轮:
比较5, 6
–> 比较6, 4
交换–> 比较4, 6
得到数据:5, 4, 6
2. 第二轮:
比较5, 4
交换–> 比较4, 5
得到数据4, 5, 6
第二种
分析以上过程,我们发现冒泡排序有两个关键要素:
1. 为了能够进行重复的来回循环,我们需要用到迭代
2. 通过每次遍历最大的数都放在了队列的末尾
代码实现
#include <stdio.h>
void print(const int *a, const int length) {
int i;
for (i = 0; i<length; i++) {
printf("%d ", a[i]);
}
putchar('\n');
}
void exchange(int *a, const int i, const int j) {
int tmp = *(a + i);
*(a + i) = *(a + j);
*(a + j) = tmp;
}
void bubbleSort(int *a, const int length) {
for (int i = 0; i < length; i++) {
//迭代
for (int j = 0; j + 1 < length-i; j++) {
if (a[j] > a[j + 1]) { //前后的两个数比较
exchange(a, j, j + 1);
}
}
print(a, length);
}
}
void main() {
const int length = 5;
int my_array[5] = { 6,5,7,3,4};
print(my_array, length);
bubbleSort(my_array, length);
print(my_array, length);
}
代码精简
void bubbleSort(int *a, const int length){
for(int i=0; i<length-1; i++){
for(int j=0; j<length-1-i; j++){
if(j+1<length && a[j]>a[j+1]){
int tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
}