当前位置: 首页 > news >正文

冒泡排序

感谢“啊哈磊”大神的神奇算法书~《啊哈!算法》
鼎力推荐

冒泡算法的核心思想就是交换
一个一个的交换,一轮一轮的交换
每一轮的目的就是把数归位


比如448 75 98 26 12这五个数从小到大排列,
先从左边第一个开始,448大于75,交换,数组为 75 448 98 26 12,把大的数移到后一位
448大于98,交换,数组为 75 98 448 26 12
448大于24,交换,数组为 75 98 26 448 12
448大于12,交换,数组为 75 98 26 12 448
至此,第一轮结束,目的就是把最大的数移到最后一位

然后第二轮再从最左边开始,目的就是把第二大的数移到倒数第二位,以此类推

一共N个数,循环N-1轮即可


作为一个Android程序员,我是比较喜欢用Java的,但是最近在研究NDK,C/C++已经忘得差不多了,得好好复习一下
所以写了两遍,强化记忆顺便练习C/C++


下面是C代码(使用IDE是Visual Studio 2015 Community):

#include <stdio.h>

int main() {
    int a[100], n, t = 0;
    scanf_s("%d", &n, 1);//输入一个数n,表示接下来有n个;ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内在泄露。所以vc++2005/2008中提供了scanf_s(),在调用时,必须提供一个数字以表明最多读取多少位字符

    //循环读入n个数到数组中
    for (int i = 0; i < n; i++) {
        scanf_s("%d", &a[i], 1);
    }

    //冒泡排序核心部分
    for (int i = 0; i < n - 1; i++) {//n个数排序,只用进行n-1趟
        for (int j = 0; j < n - 1 - i; j++) {//j<n-1-i这句很重要,从第一位一直比到最后一个尚未归为的数
            //从大到小排
            if (a[j] > a[j + 1]) {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
        }
    }

    //输出结果
    for (int i = 0; i < n; i++) {
        printf("%d ", a[i]);
    }

    getchar();
    getchar();
    return 0;
}

这里写图片描述


Java代码(使用IDE是 IntelliJ IDEA):

package com.waka.workspace;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        int[] a = new int[100];
        int n, t;

        Scanner in = new Scanner(System.in);
        n = in.nextInt();//输入n

        for (int i = 0; i < n; i++) {
            a[i] = in.nextInt();
        }

        //冒泡排序核心部分
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - 1 - i; j++) {
                if (a[j] > a[j + 1]) {//从小到大排序
                    t = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = t;
                }
            }
        }

        //输出到屏幕上
        for (int i = 0; i < n; i++) {
            System.out.print(a[i] + " ");
        }

    }
}

这里写图片描述


值得一提的是,冒泡排序的时间复杂度很高,
冒泡排序的核心部分是双重嵌套循环,它的时间复杂度是O(N^2)
所以在数据量较大的情况下,是极不推荐的排序算法。

相关文章:

  • 快速排序
  • HttpURLConnection官方文档翻译
  • android studio中xml文件代码提示问题
  • Android相机开发那些坑
  • ART、JIT、AOT、Dalvik之间有什么关系?
  • SharedPreference在使用过程中有什么注意点?
  • Android内存优化(使用SparseArray和ArrayMap代替HashMap)
  • Android中的观察者模式简单使用
  • Android内存泄漏总结
  • Android易混淆缩写笔记
  • Android将Log写入文件
  • Android 5.0(Lollipop)中的SurfaceTexture,TextureView, SurfaceView和GLSurfaceView
  • Cygwin的安装
  • Android Studio使用技巧
  • Android常用权限
  • .pyc 想到的一些问题
  • “大数据应用场景”之隔壁老王(连载四)
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Asm.js的简单介绍
  • Fastjson的基本使用方法大全
  • Java 多线程编程之:notify 和 wait 用法
  • js ES6 求数组的交集,并集,还有差集
  • JSONP原理
  • laravel with 查询列表限制条数
  • maya建模与骨骼动画快速实现人工鱼
  • MySQL数据库运维之数据恢复
  • node.js
  • Vue ES6 Jade Scss Webpack Gulp
  • Vue--数据传输
  • 从0到1:PostCSS 插件开发最佳实践
  • 分享几个不错的工具
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 区块链共识机制优缺点对比都是什么
  • 区块链技术特点之去中心化特性
  • 让你的分享飞起来——极光推出社会化分享组件
  • 再次简单明了总结flex布局,一看就懂...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (C语言)fgets与fputs函数详解
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (八)c52学习之旅-中断实验
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (十六)一篇文章学会Java的常用API
  • (转)甲方乙方——赵民谈找工作
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .net专家(张羿专栏)
  • @RequestMapping-占位符映射
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [20180129]bash显示path环境变量.txt
  • [Angular 基础] - 表单:响应式表单
  • [BT]BUUCTF刷题第4天(3.22)
  • [C#]使用PaddleInference图片旋转四种角度检测
  • [LeeCode]—Wildcard Matching 通配符匹配问题