冒泡排序是一种比较简单的排序算法
大体思路是:每一趟遍历没有排序的元素,从前往后,比较相邻的两个元素,将较大的那个元素放在后面,小的放前面(这里升序,所以大的在后);每次经历一趟后就排好一个“最大“的元素(没有排序当中最大的元素);
这里加一个图示方便读者理解
![](https://img-blog.csdnimg.cn/img_convert/e2fbbae6647c69b7f8c85cdc46649a2e.png)
//下面的n表示数组元素个数,图示为6个元素
如图,第一趟实现了排好最大的元素,后面的以此类推。
第一趟进行了5次比较,故需要循环5次(n-1次)
第二趟则只用比较剩下的4个元素,故比较了4次
.....
以此类推,要将所有的数都排好,则需要5趟(n-1趟)(排好五个元素,最后剩下的一个自然也排好了)
故我们需要两个循环,外层循环控制趟数(总共要进行n-1趟),内层循环控制每趟的遍历(每趟需要比较(n-1-排好的个数)次)
即
for (int i = 0; i < n; i++) {//外层循环决定趟数;
for (int j = 0; j < n - 1 - i; j++) {//内层循环决定每趟的任务;
if (arr[j] > arr[j + 1]) {//进行判断,如果前面的元素大于后面的元素就进行交换;
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
下面上一个实例:
用冒泡将数组排序为升序
#include<stdio.h>
int main() {
void print(int arr[], int sz);//打印函数声明
void bubble(int arr[], int sz);//冒泡函数声明
void text();//实现函数声明
text();
return 0;
}
//实现函数
void text() {
//首先定义并初始化一个乱序数组
int arr[10] = { 45,7,674,67,8,97,44,56,44,87 };
//创建一个变量储存数组长度;
int sz = sizeof(arr) / sizeof(arr[10]);//数组大小÷数组元素大小=数组长度
//打印初始乱序数组
print(arr, sz);
//用冒泡排序
bubble(arr, sz);
//打印排序后数组;
print(arr, sz);
}
//打印函数
void print(int arr[], int sz) {
for (int i = 0; i < sz; i++)
printf("%5d", arr[i]);
printf("\n");
}
//冒泡函数
void bubble(int arr[], int sz) {
for (int i = 0; i < sz; i++) {//外层循环决定趟数;
for (int j = 0; j < sz - 1 - i; j++) {//内层循环决定每趟的任务;
if (arr[j] > arr[j + 1]) {//进行判断,如果前面的元素大于后面的元素就进行交换;
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
OK,通过上面我们已经总算对冒泡排序讲解完啦(打字好累,呜呜呜~)
第一篇博客,望指点,手好冷,哭死˚‧º·(˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ )‧º·˚