冒泡排序是运用蛮力法解决排序的一种算法,这种算法比较清晰易懂
基本思想
两两比较相邻数据,如果反序则交换,直到没有反序的数据为止
实现思路
在这里我们以升序排列为例子
- 将整个待排序的记录序列划分成有序区和无序区,初始时有序区为空
- 对无序区从前向后依次比较相邻记录,若反序则交换,从而使值较大的记录往后移动(像气泡一样浮上来)
- 重复执行第二步,直到无序区没有反序的记录
设计代码时,我们可以用一个标记来记载最后一次发生交换时的位置,这样,若这个值为0,则说明无序区内没有发生交换,此时无序区已经有序,算法即完成了
思想图解
初始序列,其中蓝色区域为无序区,红色为有序区,初始有序区为空,记载i=0
两两数字进行比较,反序则交换,最后一次发生交换是在6与7位置,记i=6,执行一趟排序后,有序区中有一个数据,新的无序区为[0,6]
i不为0,则进行下一趟排序,并让i=0
同样执行第一趟的步骤,执行完后无序区为[0,4]
i不为0,则进行下一趟排序,并让i=0
同样执行第一趟的步骤,执行完后无序区为[0,3]
i不为0,则进行下一趟排序,并让i=0
执行完这一趟排序后,i=0,说明这一趟并没有反序交换(或者交换发生在0与1号位置),无序区数据都已有序,算法结束
算法代码
void bubbleSort(int r[], int n) {
int bound, exchange = n - 1;
while (exchange != 0) {
bound = exchange;
exchange = 0;
for (int i = 0; i < bound; i++) {
if (r[i] > r[i + 1]) {
int temp = r[i];
r[i] = r[i + 1];
r[i + 1] = temp;
exchange = i;
}
}
}
}
代码还是比较简单的,认真看一下就能看懂