Java与算法之(1) - 冒泡排序
冒泡排序法的原理是,每次比较相邻的两个元素,如果它们的顺序错误就把它们交换过来。
例如对4 3 6 2 7 1 5这7个数字进行从小到大的排序,从最左侧开始,首先比较4和3
因为是从小到大排序,4和3的顺序显然是错误的,交换他们,得到
接下来比较4和6
顺序是正确的,不需要任何操作。接下来进行下一步,比较6和2
6显然应该排在2的后面,怎么办?交换它们,得到
经过前面几步,已经可以总结出规律,那么接下来要做的比较依次是:
7 > 1? 得到 3 4 2 6 1 7 5
7 > 5? 得到
到此,7的右边已经没有数可以比较,第一轮排队结束。经过这一轮,已经成功的把最大的数,即7放在了最后。但是前面6个数的顺序还是不对,但是按照上面的思路很容易想到,对前面6个数再来一遍,即可把6放到倒数第二的位置。然后再对前面5个数重复逐个比较的步骤。。。
7个数字需要进行7-1=6次排队,每完成一轮排队,下一轮排队需要比较的数字个数减1,来看代码
- public class BubbleSort {
- public void sort(int... numbers) {
- //n个数执行n-1轮
- //每一轮后完成一个数字归位, 下一轮要比较的数字个数减1(所以内层循环是j < n - i)
- int n = numbers.length - 1;
- int t;
- for(int i = 0; i < n; i++) {
- for(int j = 0; j < n - i; j++) {
- if(numbers[j] > numbers[j + 1]) {
- t = numbers[j];
- numbers[j] = numbers[j + 1];
- numbers[j + 1] = t;
- }
- }
- }
- }
- }
测试
- public static void main(String[] args) {
- int[] numbers = new int[]{ 4, 3, 6, 2, 7, 1, 5 };
- System.out.print("before: ");
- for(int i = 0; i < numbers.length; i++) {
- System.out.print(numbers[i] + " ");
- }
- System.out.println();
- new BubbleSort().sort(numbers);
- System.out.print("after: ");
- for(int i = 0; i < numbers.length; i++) {
- System.out.print(numbers[i] + " ");
- }
- System.out.println();
- }
输出
- before: 4 3 6 2 7 1 5
- after: 1 2 3 4 5 6 7
冒泡排序的核心是两层嵌套的循环,时间复杂度是O(N^2),即对N个数排序,需要近似执行N的平方次。因为效率较低,实际开发中基本不会使用,但是因为简单易懂通常做为学习算法的入门案例。
如果用上面的代码对1 2 3 4 5 6 7做从小到大排列,会发现虽然数字已经排列好,但是程序还是要忠实的执行完全部两层循环。对这种情况,我们可以引入一个变量来记录一次内层循环中交换数字的个数,如果交换个数为0,则提前终止循环,在某些情况下可以提高效率。
- public void betterSort(boolean descend, int... numbers) {
- System.out.print("before: ");
- for(int i = 0; i < numbers.length; i++) {
- System.out.print(numbers[i] + " ");
- }
- System.out.println();
- //n个数执行n-1轮
- //每一轮后完成一个数字归位, 下一轮要比较的数字个数减1(所以内层循环是j < n - i)
- int n = numbers.length - 1;
- int t;
- int flag = 0;
- for(int i = 0; i < n; i++) {
- for(int j = 0; j < n - i; j++) {
- if(descend) { //从大到小
- if(numbers[j] < numbers[j + 1]) {
- t = numbers[j];
- numbers[j] = numbers[j + 1];
- numbers[j + 1] = t;
- flag = 1;
- }
- } else {
- if(numbers[j] > numbers[j + 1]) {
- t = numbers[j];
- numbers[j] = numbers[j + 1];
- numbers[j + 1] = t;
- flag = 1;
- }
- }
- }
- if(flag == 0) {
- break;
- } else {
- flag = 0;
- }
- }
- System.out.print("after: ");
- for(int i = 0; i < numbers.length; i++) {
- System.out.print(numbers[i] + " ");
- }
- System.out.println();
- }
增加一个变量需要额外占用内存空间,因此,这个方法是以空间换时间。
Java与算法之(1) - 冒泡排序的更多相关文章
- Java经典算法汇总之冒泡排序
冒泡排序基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时 ...
- java排序算法(四):冒泡排序
java排序算法(四):冒泡排序 冒泡排序是计算机的一种排序方法,它的时间复杂度是o(n^2),虽然不及堆排序.快速排序o(nlogn,底数为2).但是有两个优点 1.编程复杂度很低.很容易写出代码 ...
- java排序算法之冒泡排序(Bubble Sort)
java排序算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数 ...
- java排序算法之冒泡排序和快速排序
总结一下Java排序算法,以便记忆. 各类排序的时间复杂度: 排序方法 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) 空间复杂度 稳定性 复杂性 直接插入排序 O(n2)O(n2) O( ...
- Java 排序算法-冒泡排序及其优化
Java 排序算法-冒泡排序及其优化 什么是冒泡排序 基本写法 优化后写法 终极版本 源码及测试 什么是冒泡排序 这里引用一下百度百科上的定义: 冒泡排序(Bubble Sort),是一种计算机科学领 ...
- 算法相关——Java排序算法之冒泡排序(二)
0. 前言 本系列文章将介绍一些常用的排序算法.排序是一个非常常见的应用场景,也是开发岗位面试必问的一道面试题,有人说,如果一个企业招聘开发人员的题目中没有排序算法题,那说明这个企业不是一个" ...
- 常用Java排序算法
常用Java排序算法 冒泡排序 .选择排序.快速排序 package com.javaee.corejava; public class DataSort { public DataSort() { ...
- Hark的数据结构与算法练习之冒泡排序
算法说明: 冒泡排序实际上是使用的最多的排序,逻辑是循环然后对相邻的数字进行比较,并交换数据. 例如有一个数组int[] arrayData = { 2, 3, 1, 5, 6, 7, 4, 65, ...
- Java经典算法四十例编程详解+程序实例
JAVA经典算法40例 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程 ...
随机推荐
- ZKWeb网页框架2.0正式发布
2.0.0更新的内容有 更新框架要求 框架要求从 netstandard 1.6 升到 netstandard 2.0 框架要求从 netcoreapp1.1 升到 netcoreapp2.0 更新引 ...
- Flink升级到1.4版本遇到的坑
Flink 1.4没出来以前,一直使用Flink 1.3.2,感觉还算稳定,最近将运行环境升级到1.4,遇到了一些坑: 1.需要将可运行程序,基于1.4.0重新编译一次 2.对比了一下flink-co ...
- 封装一个button上带图片的,图片在上,文字在下的按钮
#import "CJShoppingDetailButton.h" @implementation CJShoppingDetailButton - (void)layoutSu ...
- [数据结构]C语言栈的实现
有始有终,所以我准备把各种数据结构都讲一次,栈也分顺序存储和链式储存,这里我们选择链式存储来讲,顺序存储没有难度(链式其实也是) 作为数据结构中最简单的栈,这里不会说太多,首先考虑一下下面的model ...
- ArcGIS API for JavaScript 4.2学习笔记[13] Layer的弹窗(PopupTemplate)
上一篇文章中讲到Popup是一个弹窗,是View对象的默认内置弹窗,并且在View对象构造时就顺便构造了. 那么这个PopupTemplate是什么呢? 后半截单词Template是"模板& ...
- bzoj 3139: [Hnoi2013]比赛
Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支球队各得 ...
- elasticsearch 源码本地环境搭建
elasticsearch6.0.0 源码本地环境搭建步骤如下: 1.资源准备 ElasicSearch版本:6.0.0: https://github.com/elastic/elasticsear ...
- git push的用法
git push <远程仓库名> <本地分支名>:<远程分支名>
- 我的第一个python web开发框架(19)——产品发布相关事项
好不容易小白将系统开发完成,对于发布到服务器端并没有什么经验,于是在下班后又找到老菜. 小白:老大,不好意思又要麻烦你了,项目已经弄完,但要发布上线我还一头雾水,有空帮我讲解一下吗? 老菜:嗯,系统上 ...
- python实现散列表的链表法
在散列中,链接法是一种最简单的碰撞解决技术,这种方法的原理就是把散列到同一槽中的所有元素 都放在一个链表中. 链接法有两个定理,定理一: 在简单一致散列的假设下,一次不成功查找的期望时间为O(1 + ...