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算法系列 冒泡排序的更多相关文章

  1. JAVA算法系列 快速排序

    java算法系列之排序 手写快排 首先说一下什么是快排,比冒泡效率要高,快排的基本思路是首先找到一个基准元素,比如数组中最左边的那个位置,作为基准元素key,之后在最左边和最右边设立两个哨兵,i 和 ...

  2. java算法之冒泡排序法

    由此可见:N个数字要排序完成,总共进行N-1趟排序,每第 i 趟的排序次数为 (N-i) 次,所以 可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数,即   for(inti=0;i& ...

  3. JavaScript算法 ,Python算法,Go算法,java算法,系列之【归并排序】篇

    常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的 ...

  4. Java基础系列--冒泡排序

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9064218.html 1.算法简介 冒牌排序是很耳熟的排序方式,虽然它使用的很少,但是经 ...

  5. java算法之冒泡排序

    所有的冒泡排序算法都是一样的: 冒泡排序可以分为两种情况: 一种是将无序序列排序为由小到大的升序方式: 另一种情况是将无序序列转化成一种由大到小的降序排列:

  6. 【Java算法】冒泡排序

    package suanfa; public class Maopao { public static void main(String[] args) { // TODO Auto-generate ...

  7. java基础算法之冒泡排序

    接触冒泡算法还是大一了,学习C语言的冒泡算法.现在唯一记得就是冒泡与选择了.出来刚刚工作的时候觉的算法基本没撒用处,现在发现这些都是很好的基础.因此自己也准备重新拾起这些知识. 冒泡排序 泡排序是一种 ...

  8. Java中的经典算法之冒泡排序(Bubble Sort)

    Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...

  9. Java常见排序算法之冒泡排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

随机推荐

  1. php中的占位符

    1.?这种形式传值,注意是数组! 2.:name的形式.

  2. UCOS2_STM32F1移植详细过程(三)

    Ⅰ.概述 上一篇文章是讲述ST芯片相关的配置和OS裁剪相关的配置,接着上一篇文章来讲述关于UCOS的移植,该文主要针对uC/OS-II Ports下面os_cpu_a.asm.os_cpu_c.c和o ...

  3. Python学习教程(learning Python)--2 Python简单函数设计

    本节讨论Python程序设计时为何引入函数? 为何大家都反对用一堆堆的单个函数语句完成一项程序的设计任务呢? 用一条条的语句去完成某项程序设计时,冗长.不宜理解,不宜复用,而采用按功能模块划分成函数, ...

  4. 公钥私钥 ssl/tsl的概念

    一,公钥私钥1,公钥和私钥成对出现2,公开的密钥叫公钥,只有自己知道的叫私钥3,用公钥加密的数据只有对应的私钥可以解密4,用私钥加密的数据只有对应的公钥可以解密5,如果可以用公钥解密,则必然是对应的私 ...

  5. oracle DML错误日志(笔记)

    DML错误日志是oracle10gR2引入的一个类似于SQL*Loader的错误日志功能.它的基本原理是把任何可能导致语句失败的记录转移,放到一张错误日志表中. 具体使用如下: 1.使用DBMS_ER ...

  6. .net 日期格式化

    有时候我们要对时间进行转换,达到不同的显示效果 默认格式为:2005-6-6 14:33:34 如果要换成成200506,06-2005,2005-6-6或更多的该怎么办呢 我们要用到:DateTim ...

  7. libcurl 安装使用一

    一.下载libcurl http://curl.haxx.se/download/curl-7.21.1.tar.gz 二.安装   指定了安装目录     /usr/local/curl 命令1: ...

  8. iOS学习之Object-C语言字符串和数值

    一.使用苹果帮助文档      1.帮助文档的作用:帮助开发者快速了解系统类的功能.           1)苹果每次iOS版本的升级,都会添加或者更新大量的API,并提供相应的参考文档.       ...

  9. python数组的使用

    python数组的使用 2010-07-28 17:17 1.Python的数组分三种类型:(1) list 普通的链表,初始化后可以通过特定方法动态增加元素.定义方式:arr = [元素] (2) ...

  10. UIBezierPath 的使用介绍

         使用UIBezierPath类可以创建基于矢量的路径.此类是Core Graphics框架关于path的一个封装.使用此类可以定义简单的形状,如椭圆或者矩形,或者有多个直线和曲线段组成的形状 ...