JAVA算法系列 冒泡排序
java算法系列之排序
手写冒泡
冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直接排序,之所以直接,就是简单粗暴,不像冒泡,冒泡是紧挨着的两个小伙伴两两比较,直接排序是每一趟直接拿当前i与整个数组中所有元素进行比较,如果大小不一致,直接替换,相当于跳跃过去了,根本不考虑小伙伴的感受,我看到哪个小伙伴比我小,我就占领它的位置,彼此替换。
package com.rsc.sort;
import java.util.Arrays;
/**
* 冒泡排序
*
* @author 落雨 2015年6月5日09:33:13 http://ae6623.cn
*/
public class BubbleSort {
/**
* 直接排序(选择排序)
* i与j进行比较,如果大小不一致,直接将a[i]与a[j]元素进行置换
* @param array
*/
public static void selectionSort(int[] array) {
int temp = 0;
int total = 1;
for (int i = 0; i < array.length; i++) {// 循环length次
//System.out.println("第"+i+"趟");
for (int j = i + 1; j < array.length; j++) {// 从i+1开始和i进行比较,找到大小不一致的,直接与a[i]进行置换
if (array[i] > array[j]) {
temp = array[i];
array[i] = array[j];
array[j] = temp;
for (int k : array) {
System.out.print(k + " ");
}
System.out.println("交换" + total++ + "次 【" + array[j] + "交换"
+ array[i] + "】");
}
}
}
}
/**
* 冒泡排序
* 只置换相邻的两个元素
* @param array
*/
public static void bubbleSort(int[] array) {
int temp = 0;
int total = 1;
boolean flag = false;
//对于length个元素,只需要比较length-1即可 比如 5个数字,只需要循环比较4次
for(int i=0;i<array.length-1;i++){
//由于是冒泡排序,第一个位置肯定是最小的,每循环i次,就不用再判断前i个位置,所以length-1-i
for(int j=0;j<array.length-i-1;j++){
if(array[j]>array[j+1]){
/*
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
*/
array[j] = array[j] ^ array[j+1];
array[j+1] = array[j] ^ array[j+1];
array[j] = array[j] ^ array[j+1];
flag = true;//发生了置换
for (int k : array) {
System.out.print(k + " ");
}
System.out.println("交换" + total++ + "次 【" + array[j+1] + "交换"
+ array[j] + "】");
}
}
if(!flag){//如果无置换,则跳出循环
break;
}else{
flag = false;//有置换,把标志位重新置为false,方便下一次判断
}
System.out.println("完成第"+(i+1)+"趟冒泡");
}
}
public static void swap(int a,int b){
a = a^b;
b = a^b;
a = a^b;
System.out.println(a+","+b);
}
public static void main(String[] args) {
//swap(5,3);
int[] array = { 4, 1, 3, 2, 5 , 6 , 8 , 7 , 9 };
int[] array2 = Arrays.copyOf(array, array.length) ;
System.out.println("直接排序如下:");
selectionSort(array);
System.out.println("冒泡排序如下:");
bubbleSort(array2);
}
}
打印结果如下:
直接排序如下:
1 4 3 2 5 6 8 7 9 交换1次 【4交换1】
1 3 4 2 5 6 8 7 9 交换2次 【4交换3】
1 2 4 3 5 6 8 7 9 交换3次 【3交换2】
1 2 3 4 5 6 8 7 9 交换4次 【4交换3】
1 2 3 4 5 6 7 8 9 交换5次 【8交换7】
冒泡排序如下:
1 4 3 2 5 6 8 7 9 交换1次 【4交换1】
1 3 4 2 5 6 8 7 9 交换2次 【4交换3】
1 3 2 4 5 6 8 7 9 交换3次 【4交换2】
1 3 2 4 5 6 7 8 9 交换4次 【8交换7】
完成第1趟冒泡
1 2 3 4 5 6 7 8 9 交换5次 【3交换2】
完成第2趟冒泡
JAVA算法系列 冒泡排序的更多相关文章
- JAVA算法系列 快速排序
java算法系列之排序 手写快排 首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,i 和 ...
- java算法之冒泡排序法
由此可见:N个数字要排序完成,总共进行N-1趟排序,每第 i 趟的排序次数为 (N-i) 次,所以 可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数,即 for(inti=0;i& ...
- JavaScript算法 ,Python算法,Go算法,java算法,系列之【归并排序】篇
常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的 ...
- Java基础系列--冒泡排序
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9064218.html 1.算法简介 冒牌排序是很耳熟的排序方式,虽然它使用的很少,但是经 ...
- java算法之冒泡排序
所有的冒泡排序算法都是一样的: 冒泡排序可以分为两种情况: 一种是将无序序列排序为由小到大的升序方式: 另一种情况是将无序序列转化成一种由大到小的降序排列:
- 【Java算法】冒泡排序
package suanfa; public class Maopao { public static void main(String[] args) { // TODO Auto-generate ...
- java基础算法之冒泡排序
接触冒泡算法还是大一了,学习C语言的冒泡算法.现在唯一记得就是冒泡与选择了.出来刚刚工作的时候觉的算法基本没撒用处,现在发现这些都是很好的基础.因此自己也准备重新拾起这些知识. 冒泡排序 泡排序是一种 ...
- Java中的经典算法之冒泡排序(Bubble Sort)
Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...
- Java常见排序算法之冒泡排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
随机推荐
- 通过messenger实现activity与service的相互通信
布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:to ...
- Laravel 5 基础(五)- 环境与配置
.env 文件是配置文件,包括数据库配置信息,查看 config->database.php ,connections 里面包含了所有数据库的配置,可以在 default 中选择要使用的数据库. ...
- [下载] VS 2013 Update 4 & 社群版 (Visual Studio Community) & VS 2015 Preview预览版
这是我的备份,原文请看http://www.dotblogs.com.tw/mis2000lab/archive/2014/11/13/vs2013_update4_community_vs2015_ ...
- ASP.NET中前台调用后台的方法
学习文章:http://www.cnblogs.com/kingteach/archive/2010/11/12/1875633.html 练习代码: 前台: <html xmlns=" ...
- Oracle 查看相关优化器参数
select x.ksppinm name, y.ksppstvl value, y.ksppstdf isdefault, decode(bitand(y.ksppstvf, 7), 1, 'MOD ...
- PagerAdapter的notifyDataSetChanged无效解决方法
在Adapter中复写该方法: @Override public int getItemPosition(Object object) { return POSITION_NONE; } 即可~~
- Android之完美退出方法
为什么要写这篇文章? 网上有很多种退出方法,可实际上很多方法都不通用(在某个版本下可用,到了另一个版本就不行),或者方法的实际效果根本就和其描述不符(也不知道那些发帖的人测没测试过). 但我们的需求又 ...
- AppCan移动技术全景图:创新、协作、支撑
开发者是移动互联网宏伟蓝图的最终实现者.如果你有创意.有技术,你可以开发一款服务上亿人的应用.所以,我感觉幸运,没有任何一个时代,能像现在这么好,技术人能够服务这么广大的市场,能够撬动百亿级的市场. ...
- MVC4.0 使用Form认证,自定义登录页面路径Account/Login
使用MVC4.0的时候,一般遇到会员登录.注册功能,我们都会使用Form认证,给需要身份验证的Action进行授权(需要登录后才能访问的Action添加[Authorize]属性标签),登录.注册的时 ...
- 一个关于C#中基类与接口混合继承的疑问总结
思路参照 http://www.cnblogs.com/allenlooplee/archive/2004/11/16/64553.html,对原文进行了简化和补充,感谢原作者. 问题很简单,如下所示 ...