冒泡算法(BubbleSort)

冒泡算法核心就是遍历数组,从头或者尾部开始比较大小,从头部比较的话(升序)将大的换到右边,从头开始,遍历一次就是将数据最大的放在最后边,然后第二遍遍历就是将第二大放在右边第二的位置。
遍历结束是完整遍历没有交换。
例子如图:

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;
}
上一篇:基本的排序算法实现-java版本


下一篇:静态方法的缺失