【算法基础】-- 交换排序篇 - 冒泡排序

冒泡排序是交换排序中最简单的算法,所谓交换,是指根据序列中两个元素的关键字的比较结果来对换这两个记录在序列中的位置。

思想为:
假设待排序表长为 n ,从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即 A [ i - 1 ] > A [ i ]),则交换它们,直到序列比较完。一趟冒泡的结果,是将当前最小元素移动到最终位置,这样,最多进行 n - 1 趟排序,所有记录都会被排好,最终达到升序状态。

算法存储结构适用性:适用于顺序存储结构链式存储结构,对于单链表,只能从前向后进行比较。

算法实现

/*
    冒泡排序:
        时间复杂度->最好情况:O(n)、平均情况:O(n^2)、最坏情况:O(n^2)
        空间复杂度->O(1)
        是否稳定->是
*/
#include<bits/stdc++.h>
#define MAX_SIZE 5
using namespace std;
typedef struct{
    int key;
}ElemType;
void BubbleSort(ElemType A[],int n){//结果为升序序列,且为向A[0]方向冒泡
    bool flag;
    int i,j;
    for(i=0;i<n-1;i++){//进行n-1趟排序,第i趟排序表示:A[i]及以后的元素为无序
        flag=false;
        for(j=n-1;j>i;j--){//对于每次的排序都从序列末尾开始,对于连续相同的部分子序列,从左面第一个开始交换
            if(A[j-1].key>A[j].key){//此处的小于号,决定了,冒泡排序是一个稳定的排序
                swap(A[j-1],A[j]);
                flag=true;//如果一趟比较中没出现交换,则flag=false
            }
        }
        if(flag==false){//如果flag=false,说明待排序表已经有序,则提前结束n-1次排序,即这时,排序趟数不到n-1次
            return;
        }
    }
}
int main(){
    ElemType A[MAX_SIZE]={{5},{4},{3},{2},{1}};
    BubbleSort(A,MAX_SIZE);
    for(int j=0;j<MAX_SIZE;j++){
        cout<<A[j].key;
    }
    return 0;
}
发布了83 篇原创文章 · 获赞 15 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_42127861/article/details/103091648