Java中的冒泡排序

排序的第一种思想:将第一个值与后面的值相比较,如果第一个值比其他值小,那么将较大的值与第一个换位置,然后继续比较直至所有的数比较完成。这样就可以保证第一个数是最大数。然后将第二个数再重复进行一遍此操作,不同的是第二个数进行操作时不用与第一个相比,因为已经确定过第一个是最大值。

排序的第二种思想:将两个相邻的数比较(第一个值和第二个值;第二个值和第三个值;第三个值和第四个值……),如果第一个值比第二个值小,那么将这两个值换一个位置,然后后面依次进行此操作,这样可以保证最小值在最后面。

首先冒泡排序的核心思想就是循环赋值,将两个值在条件满足的情况下交换位置。
例如:  3 , 5  如果第一个值小于第二个值则进行交换  →     5 , 3
而在Java中进行换位置的操作我们不能直接交换值,直接交换值的话会将值覆盖
比如说:

 package Dome;

 public class Dome1 {

     public static void main(String[] args) {

         int arr[] = { 1, 2, 3, 4, 5 };

         System.out.println(arr[0] + ":" + arr[1]);

         arr[0] = arr[1]; // 将下标为1的值赋值给下标为0的值

         arr[1] = arr[0]; // 将下标为0的值赋值给下标为1的值

         System.out.println(arr[0] + ":" + arr[1]);

     }

 }

但是这样交换值的方法是错误的:

因为首先进行
  arr[0] = arr[1];
此时arr[0]已经被修改为2了也就是arr[1]的值;
再将arr[0]的值赋值给arr[1]的话他们的值就是相同的了;

所以交换值正确的做法为:

 package Dome;

 public class Dome1 {

     public static void main(String[] args) {

         int arr[] = { 1, 2, 3, 4, 5 };

         System.out.println(arr[0] + ":" + arr[1]);

         int temp;

         temp = arr[0];        //将下标为0的值赋值给temp

         arr[0] = arr[1]; // 将下标为1的值赋值给下标为0的值

         arr[1] = temp;     // 将下标为0的值赋值给下标为1的值

         System.out.println(arr[0] + ":" + arr[1]);

     }

 }

首先定义一个与数组类型相同的变量temp(名字自定义)来储存数组中的值,先将arr[0]的赋值给temp,然后将arr[1]赋值给arr[0],最后将temp的值赋值给arr[1];通俗的来讲有一桶浑水和一桶干净水,如果想换个水桶装肯定不能直接将浑水往干净的水里面倒,则要另一个桶来装浑水,然后将干净的水倒入装浑水的桶里面,然后再将转移的浑水装入原来的装干净的水的水桶中,所以这里我们就需要多一个桶,也就是变量temp,这个变量的作用就是储存一个数组中的某个值,以便进行交换,避免覆盖 ;

而冒泡的核心操作就是循环进行赋值,直到排序完成;

那么我们接下来进行具体的操作(以数组[1,2,3,4,5]为例):

1.开始我们阐述的第一种排序思想(将第一个值依次与后面的相比):
首先进行第一个值的比较:
  第一个值与第二个值比较满足条件进行交换  :  2,1,3,4,5
  第一个值与第三个值比较满足条件进行交换  :  3,1,2,4,5
  第一个值与第四个值比较满足条件进行交换  :  4,1,2,3,5
  第一个值与第五个值比较满足条件进行交换  :  5,1,2,3,4
  此时第一个值的比较完成,现在数组中第一个值便是数组中的最大值;

开始进行第二个值的比较:
(第二个值不需要与第一个相比因为在第一轮已经比过了)
  第二个值与第三个值比较满足条件进行交换  :  5,2,1,3,4
  第二个值与第四个值比较满足条件进行交换  :  5,3,1,2,4
  第二个值与第五个值比较满足条件进行交换  :  5,4,1,2,3
  此时第二个值的比较完成,现在第二个值为数组中的第二大的值;

开始进行第三个值的比较:
  第三个值与第四个值比较满足条件进行交换  :  5,4,2,1,3
  第三个值与第五个值比较满足条件进行交换  :  5,4,3,1,2
  此时第三个值的比较完成。

开始进行第四个值的比较:
  第四个值与第五个值比较满足条件进行交换  :  5,4,3,2,1
至此排序完成。

然后总结一下规律:
  我们开始比较的值总共有四个(第一个值,第二个值,第三个值,第四个值)也就是数组的长度减1,而被比较的值是从开始比较的值的下标加1开始的然后自增,例如第一个值比较是是从第二个值开始与第一个值比较,第一轮总共比较了4次,第二轮3次,第三轮2次,第四轮1次。

然后找规律:
外层循环 内层循环开始的下标(下标是从0开始所以要减一) 内层循环次数

   1            2-1               4
   2            3-1               3
   3            4-1               2
   4            5-1               1
因为是遍历数组要使用下标,所以要从0开始所以将外层循环的1,2,3,4改为0,1,2,3

代码如下:

 package Dome;

 public class Dome1 {
public static void main(String[] args) {
int arr[] = { 1, 2, 3, 4, 5 };
int temp; // 定义一个变量储存数组中的值
int x = 0;// 交换的次数 // 外层循环的次数为数组长度减1 -->arr.length - 1
for (int i = 0; i < arr.length - 1; i++) {
/**
* 因为是下一个值与前面的值比较所以j的下标为i+1 而j的值会随着i增加第一次为1,第二次为2,第三次为3,第四次为4
* 循环的次数为: 4 3 2 1 因为j自增 所以j只需要小于5即数组的长度即可
*/
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] < arr[j]) {
// 进行交换
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp; }
x++;// 交换的次数自增+1 // 查看每次操作过后的组数
System.out.print("第" + x + "次交换" + ":\t");
for (int z = 0; z < arr.length; z++) {
System.out.print(arr[z] + " ");
}
System.out.println();
}
}
}
}

运行的结果

发现每次的结果与分析时的一样。由此排序完成

1.开始我们阐述的第一种排序思想(相邻的比较):
首先从第一个值开始比较:
  第一个值与第二个值比较满足条件进行交换  :  2,1,3,4,5
  第二个值与第三个值比较满足条件进行交换  :  2,3,1,4,5
  第三个值与第四个值比较满足条件进行交换  :  2,3,4,1,5
  第四个值与第五个值比较满足条件进行交换  :  2,3,4,5,1
  这种操作核心原理与第一种相同,但是这种操作的结果是将最小的值往后移,第一次操作完的结果会使最后一位为最小值;
进行第二次比较:
  第一个值与第二个值比较满足条件进行交换  :  3,2,4,5,1
  第二个值与第三个值比较满足条件进行交换  :  3,4,2,5,1
  第三个值与第四个值比较满足条件进行交换  :  3,4,5,2,1
  因为确定最后一个数为最小值了所以比较到倒数第二个就可以结束了,此时倒数第二个的值为倒数第二小;
进行第三次比较:
  第一个值与第二个值比较满足条件进行交换  :  4,3,5,2,1
  第二个值与第三个值比较满足条件进行交换  :  4,5,3,2,1
  此时倒数第三个数为倒数第三小;
进行第四次比较:
  第一个值与第二个值比较满足条件进行交换  :  5,4,3,2,1
  此时倒数第四个数为倒数第四小;第一个数为最大;比较完成
然后总结一下规律:
  和第一种相似,外层循环也进行了四次,就是数组的长度减1,内层循环分别进行了4,3,2,1次;不一样的是这次的比较每次都是从第一个第一个值开始(下标对应的为0),但是循环的次数依次减少,所以我们限制循环的次数的条件要变;
找规律:
 外层循环 外层开始的下标 内层开始的下标  内层循环次数
   1      0         0        4
   2      1         0        3
   3      2         0        2
   4      3         0             1
  因为这次排序中外层循环的下标只用于控制外层循环的次数所以可以不用写出来;
代码如下:

 package Dome;

 public class Dome1 {
public static void main(String[] args) {
int arr[] = { 1, 2, 3, 4, 5 };
int temp; // 定义一个变量储存数组中的值
int x = 0;// 交换的次数 // 外层循环的次数为数组长度减1 -->arr.length - 1
for (int i = 0; i < arr.length - 1; i++) {
/**
* 因为是相邻的值比较,所以只用到了j的下标,i的下标只用来控制循环次数
* j每自增一次就是往后面移一次相邻的两个数
*/
for (int j = 0; j < arr.length-1-i; j++) {
if (arr[j] < arr[j+1]) {
//进行交换
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
x++;// 交换的次数自增+1 // 查看每次操作过后的组数
System.out.print("第" + x + "次交换" + ":\t");
for (int z = 0; z < arr.length; z++) {
System.out.print(arr[z] + " ");
}
System.out.println();
}
}
}
}

结果如下:

分析的与结果一致,第二种排序完成;

至此完成了两种冒泡排序,如有错误和建议请在评论留言。

                           2019-03-25  16:27:55

Java中的冒泡排序的更多相关文章

  1. Java中的冒泡排序(减少比较次数)

    package yzhou.sort; import java.util.Arrays; public class BubbleSort { public static void main(Strin ...

  2. java中关于冒泡排序算法的学习。

    在编程语言的学习中,排序算法在学习过程中是必须要掌握的,特别在新手的学习中,我们应该学会这些算法,本篇先介绍冒泡算法. 冒泡排序 设有一组待排序的数据: 3 2 4 5 7 1 我们需要使用冒泡排序来 ...

  3. Java中的冒泡排序和选择排序

    //冒泡排序 public class Test5 { public static void main(String[] args) { int[] arr = {12,2,25,89,5}; bub ...

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

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

  5. Java中数组的几个常用算法:插入算法,删除算法,冒泡排序算法

    前言: 在Java中我们常常会用数组,提到数组就不得不介绍数组中常用到的几个算法. 有插入算法,删除算法,冒泡排序算法等. 在学习这几个数组的算法前,我们先来了解一下关于数组一些基本知识. 数组的基本 ...

  6. Java中常用的查找算法——顺序查找和二分查找

    Java中常用的查找算法——顺序查找和二分查找 神话丿小王子的博客 一.顺序查找: a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位 ...

  7. Java中的排序算法(2)

    Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...

  8. JAVA算法系列 冒泡排序

    java算法系列之排序 手写冒泡 冒泡算是最基础的一个排序算法,简单的可以理解为,每一趟都拿i与i+1进行比较,两个for循环,时间复杂度为 O(n^2),同时本例与选择排序进行了比较,选择排序又叫直 ...

  9. JAVA中运用数组的四种排序方法

    JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法. 快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现. 冒泡法是运用遍历数组进 ...

随机推荐

  1. JavaWeb学习总结(八):HttpServletRequest对象

    一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...

  2. PHP获取本地时间

    使用date ( "Y-m-d H:i:s" )函数获取当前时间,总是不对,原来默认是格林威治时间,解决的办法有两个: 1.获取之前先加   date_default_timezo ...

  3. drupal7 为视图添加 过滤标准 内容类型

    1.单击 FILTER CRITERIA 右边的“添加”按钮 2.在弹出的对话框中输入“类型”,单击搜索结果中的“内容:类型” 3.确定之后,选择需要的内容类型即可,例如添加“书评”内容类型的过滤 4 ...

  4. AJAX 概念 优势 发展前景 工作原理 底层技术 状态 缺点 框架

    1. 概念 Ajax asynchronous JavaScript and XML , 异步js和xml. 这种解释已经过时了, 现在ajax就是, 允许浏览器和服务器通信, 而无需刷新当前页面的技 ...

  5. Storm-Concept

    1. Storm集群架构          strom jar all-your-code.jar backtype.storm.MyWordCounterTopology arg1 arg2 这个命 ...

  6. Week2——XML

    一.什么是XML? XML是可扩展标记性语言,类似于HTML,被设计为传输和存储数据,其焦点是数据的内容.XML的标签没有被预定义,用户就需要自行定义标签,也可随意定义标签.XML 允许创作者定义自己 ...

  7. windows&cmd常用命令&快捷键

    1: cls即CLear Screen 功能:清除屏幕上的所有显示 2:Win+Tab快捷键进行3D窗口切换还有比较快速切换窗口的新方法. 3:利用Alt+Tab快捷键进行切换窗口时,在桌面中间会显示 ...

  8. ASP.NET中的身份验证有那些?你当前项目采用什么方式验证请解释

    ASP.NET身份验证模式包括Windows.Forms(窗体).Passport(护照)和None(无). l  Windows身份验证—常结合应用程序自定义身份验证使用使用这种身份验证模式时,AS ...

  9. bmp制作自定义字体(cocostudio使用)

    工具需求:bmpfont 1.步骤 (1)制作 * 把自己的字体放到一个txt文件中,写个脚本抽离出来, 重复了没有关系 * Edit->Select chars from fils(注意:Ed ...

  10. Java并发基础(上)——Thread

    并发编程可以使我们将程序划分为多个分离的,独立运行的任务.通过多线程机制,这些独立任务都将由执行线程来驱动.在使用线程时,CPU将轮流给每个任务分配占用时间,每个任务都觉得自己在占用CPU,但实际上C ...