一、原理
对于长度为n的数组,我们对数组的前n,n-1,n-2,n-3,…,0个数组进行“冒泡”,即比较前一个数据与后一个数据的大小,若前者更大,交换位置。这样一来,最大的数据便可以移到数组的末位置。进行n-1次上述操作后,数组排序即完成。
二、流程
(1)遍历数组至第n-1个数据,比较相邻两数据大小,若前者更大,交换二者位置;
(2)n–。
三、实现
#include <cstdio>
int main() {
int n;
scanf("%d", &n);
int data[n + 5];
int i;
for(i = 0; i < n; i++) {
scanf("%d", &data[i]);
}
int temp, end;
for(end = n - 1; end >= 0; end--) {
for(i = 0; i < end; i++) {
if(data[i] > data[i + 1]) { // 如果此处改成<,便可实现从大到小
temp = data[i + 1];
data[i + 1] = data[i];
data[i] = temp;
}
}
}
for(i = 0; i < n; i++) {
printf("%d ", data[i]);
}
return 0;
}
四、思考
对于n-1次遍历操作,有一些部分有序的数组事实上不需要那么多次即可得到完全有序的数组。如何判断这种情况以节省时间?
参考:冒泡排序以及冒泡排序的优化 - onlycxue