冒泡算法核心就是遍历数组,从头或者尾部开始比较大小,从头部比较的话(升序)将大的换到右边,从头开始,遍历一次就是将数据最大的放在最后边,然后第二遍遍历就是将第二大放在右边第二的位置。
遍历结束是完整遍历没有交换。
例子如图:
2 3 5 1 6 4 初始数组
2 3 1 5 4 6 第一次遍历结束。 最大的6在最后边
2 1 3 4 5 6 第二次遍历结束。 第二大5在右边
1 2 3 4 5 6 第三次遍历结束。 发现已经遍历完成
1 2 3 4 5 6 第四次遍历结束。 这次必须再遍历,因为必须判断没有交换就是顺序完成时,但是第三次遍历仍然交换1与2,因此需要遍历第四遍。
逆序同理
代码如下:c++
#include "iostream"
#define MAXSIZE 21
using namespace std;
struct SqList{
int data[MAXSIZE];
int length;
};
SqList initList(){
SqList sqList;
sqList.length = 0;
int N, tmp;
cin >> N;
for (int i = 0; i < N; ++i) {
cin >> tmp ;
sqList.data[sqList.length++] = tmp;
}
return sqList;
}
void swap(int &a, int &b){
int tmp = a;
a = b;
b = tmp;
}
void BubbleSort(SqList *sqList){
for (int i = 0; i < sqList->length; ++i) {
bool flag = false;
for (int j = 0; j < sqList->length - 1; ++j) {
if (sqList->data[j] > sqList->data[j+1]){
swap(sqList->data[j],sqList->data[j+1]);
flag = true;
}
}
if (!flag){
return;
}
}
}
void BubbleSortInverse(SqList *sqList){
for (int i = 0; i < sqList->length; ++i) {
bool flag = false;
for (int j = sqList->length; j > 0; --j) {
if (sqList->data[j] < sqList->data[j-1]){
swap(sqList->data[j],sqList->data[j-1]);
flag = true;
}
}
if (!flag){
return;
}
}
}
void printList(SqList sqList){
for (int i = 0; i < sqList.length; ++i) {
cout << sqList.data[i] << " ";
}
}
int main(){
SqList sqList = initList();
BubbleSort(&sqList);
printList(sqList);
return 0;
}