火龙信奥
  • 首页
  • 课程
  • 题库
  • 打卡
    • 代码对战
    • 快速对战
  • 题单
  • 团队
  • 荣誉墙
  • 商城
  • 登录 / 注册

冒泡法以及改进版

作者: 作者的头像   huolong , 时间:2024-05-18 11:32:08 , 所有人可见, 阅读  11

int a[5] = {2,3,4,1,5} ; 
bool cmp(int a, int b){
    return a>b;
}
int main(){
    //复杂度是O(nlog(n)) 
    sort(a+0, a+5, greater<int>()  ) ; //系统的排序函数
    sort(a+0, a+5, cmp ) ; //自定义函数cmp 
    //reverse(a+0, a+5) ;//逆序  

    for(int i=0; i<5; i++){
        cout << a[i] << " " ;
    }
    return 0;
}

冒泡排序

int a[5] = {3,2,1,5,4} ; 
// 3,2,1,5,4 
int main(){
    int n = 5;
    int tot = 0;//记录交换的次数 
    //冒泡排序 
    for(int i=0; i<n-1; i++){
        for(int j=0; j<n-1-i; j++){
            if(a[j] > a[j+1]) swap(a[j], a[j+1]) , tot = tot + 1; 
        }
    }
    //比较次数? = (n-1) + (n-2) + (n-3) +...+1 = n*(n-1)/2
    //复杂度是O(n^2) 
    //需要交换几次? = 原来数组中逆序对的对数 

    cout << tot << "\n" ;

    for(int i=0; i<5; i++){
        cout << a[i] << " " ;
    }



    return 0;
}

//改进版 //复杂度是O(n^2)

bool flag = true;
int k = n;
while(flag){
    flag = false;

    for(int j=0; j<k-1; j++){
        if(a[j] > a[j+1]) swap(a[j], a[j+1]) , flag = true; 
    }

    k --; 
}

//加入保存最右端的交换位置pos //复杂度是O(n^2)

#include<bits/stdc++.h>
using namespace std ;
int a[5] = {2,1,4,3,5} ;
int main(){
    int n = 5;
    int pos; // 记录最后交换的位置

    for (int i = 0; i < n - 1; ++i) {
        bool flag = false;
        pos = 0; // 重置 pos

        for (int j = 0; j < n - 1 - i; ++j) {
            if (a[j] > a[j + 1]) {
                // 交换元素
                swap(a[j], a[j + 1]);
                flag = true;
                pos = j; // 更新 pos 为最后交换的位置
            }
        }

        if (!flag) {
            break; // 如果没有发生交换,数组已经排序完成
        }

        for (const auto& i : a) {
            std::cout << i << " ";
        }
    }
    return 0;
}


插入排序 //复杂度是O(n^2)

//插入Insert sort 
    int n = 5;
    for(int i=1; i<n; i++){
        int vip = a[i] ;//
        int j = i-1;
        while(a[j] > vip && j>=0){
            a[j+1] = a[j] ;
            j --;
        }
        a[j+1] = vip ;
    } 
    for(auto i : a){
        cout << i << " ";
    }

//选择排序 selection sort //复杂度是O(n^2)

     int n = 5;
     for(int i=0; i<n; i++){
        int k = i;
        for(int j=i+1; j<n; j++){
            if (a[j] < a[k]) k = j ;
        }
        if(k != i) {
            swap(a[k] , a[i]) ;
        } 
     }

计数排序

int n  =5;
    //计数排序 
    for(int i=0; i<n; i++){
        train[ a[i] ] ++;
    }

    for(int i=0; i<100; i++){
        if(train[i]){
            for(int j=0; j< train[i]; j++){
                cout << i << " ";
            }
        }
    }

—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com

©2026加盟我们 | 关于我们 | ACM课程 | 常见问题 | 成果墙 | 评测记录 | 浙ICP备2021013995号
在线画图 | OI WIki | 打字练习
火龙信奥
请输入登录信息


请完成安全验证
验证码底图 滑块
向右拖动滑块完成验证
请输入用户名 / 绑定的手机号码



请输入注册信息(手机号验证码注册)





验证码5分钟有效,60秒内不可重复获取,每日最多3次

微信登录

微信登录二维码

正在生成二维码...

账号已过期,请续期。
去续期

绑定手机号

📱

为了更好地保护您的账号安全,享受完整的平台服务

请您尽快绑定手机号码