数据结构与算法——冒泡排序

什么是冒泡排序?

  冒泡排序是一种交换排序,所谓交换,就是将相邻元素两两比较,如果反序则进行交换从而使元素有序。之所以叫冒泡排序是因为,元素是从最后开始进行两两比较,将小的元素放到最上面的位置,看上去就跟气泡往上冒一样。

代码实现

<span style="font-family:Courier New;font-size:14px;">#include <iostream>
#define MAXSIZE 10
using namespace std;
struct SqList {
    int r[MAXSIZE];
    int length;
};

//元素交换
void swap(SqList *L,int i,int j) {
    int temp;
    temp = L->r[i];
    L->r[i] = L->r[j];
    L->r[j] = temp;
}
/**
    冒泡排序 共需进行n-1趟
    从最后一个元素开始依次与前一个元素进行比较,
    若小于前一个元素,则进行交换
*/
void BubbleSort(SqList *L) {
    int i,j;
    for(i=1;i<L->length;i++) {
        for(j=L->length-1;j>=i;j--) {
            if(L->r[j]>L->r[j+1]) {
                swap(L,j,j+1);
            }
        }

    }
}
/**

    增进版 冒泡排序
    这是为了再进行一两次比较后,元素已经有序了,
    后面不再需要进行比较排序了。
    比如序列:2,1,3,4,5,6,7,8,9
    当进行完依次比较后,此时序列为1,2,3,4,5,6,7,8,9
    那么此时已经有序了,因此后面就无序比较,直接退出循环就行
    所以,引入一个标志变量,当元素交换时置为true,没有时置为false
    则在外循环中,当变量为false时,就退出循环了,说明此时已经有序了
*/
void BubbleSort2(SqList *L) {
    int i,j;
    bool flag = true;
    for(i=1;i<L->length&&flag;i++) {
        flag = false;
        for(j=L->length-1;j>=i;j--) {
            if(L->r[j]>L->r[j+1]) {
                swap(L,j,j+1);
                flag = true;
            }
        }
    }
}
void Print(SqList *L) {
    for(int i=1;i<=L->length;i++) {
        cout<<L->r[i]<<" ";
    }
    cout<<endl;
}

int main()
{
    SqList s={{0,9,1,5,8,3,7,4,6,2},9}; //0为占位
    cout<<"排序前:"<<endl;
    Print(&s);
    BubbleSort(&s);
    cout<<"排序后:"<<endl;
    Print(&s);
    return 0;
}
</span>

点赞