java基础之冒泡排序

1.冒泡排序

冒泡排序是一种比较简单的排序算法。算法的原理是:

重复地走访过要排序的数列,一次比较相邻的两个元素,按照规定好的顺序进行比较,如果他们的顺序错误就把他们交换过来。走访数列的工作重复的进行直到没有再需要交换的元素,此时数列的排序已经完成。

核心代码:

 1 private static void bubbleSortTest(int arr[]) {
 2     int temp = 0;
 3     for (int i = 0; i < arr.length-1; i++) {
 4         for (int j = arr.length-1; j > i; j--) {
 5             if (arr[j-1] > arr[j]) {
 6                 temp = arr[j-1];
 7                 arr[j-1] = arr[j];
 8                 arr[j] = temp;
 9             }
10         }
11     }
12 }

以上代码完成的工作是采用冒泡排序从小到大排列一个数组。

在外循环中从前往后读数组,然后在内循环中从后往前比较,相邻的数进行两两比较,若前一个数比它相邻的后一个大,则交换他们的位置。每次外循环一次都把第i小的元素移到了arr[i]的位置,所以内循环中的条件是j>i,因为arr[i]前面的都排好了序。每次从后往前比较时,到了arr[i]就不用再继续了。

当然,上面的核心代码也可以写成以下这种形式:

 1 private static void bubbleSortTest2(int arr[]) {
 2     int temp = 0;
 3     for (int i =  arr.length-1; i > 0; i++) {
 4         for (int j = 0; j < i; j++) {
 5             if (arr[j] < arr[j+1]) {
 6                 temp = arr[j+1];
 7                 arr[j+1] = arr[j];
 8                 arr[j] = temp;
 9             }
10         }
11     }
12 }

这里思想跟上面是一样的,都是相邻两个元素的比较。只是bubbleSortTest2(int arr[])是从前往后比较,把最大的数往后移。

冒泡排序java实现的完整代码:

 1 public class BubbleSortTest {
 2
 3     public static void main(String[] args) {
 4         int[] intArr;
 5         intArr = new int[]{5,4,3,2,1};
 6         System.out.println("排序前:");
 7         printList(intArr);
 8         bubbleSortTest(intArr);
 9         System.out.println("排序后:");
10         printList(intArr);
11     }
12     /*冒泡排序核心代码*/
13     private static void bubbleSortTest(int arr[]) {
14         int temp = 0;
15         for (int i = 0; i < arr.length - 1; i++) {
16             for (int j = arr.length - 1; j > i; j--) {
17                 if (arr[j - 1] > arr[j]) {
18                     temp = arr[j - 1];
19                     arr[j - 1] = arr[j];
20                     arr[j] = temp;
21                 }
22             }
23         }
24     }
25
26     public static void printList(int[] list) {
27         for (int value : list) {
28            System.out.print(value + " ");
29         }
30         System.out.println();
31     }
32 }

2.冒泡排序的优化版

对冒泡排序常见的优化方法是加入一个标志变量changeFlag,用于标志某一趟排序过程中是否有数据交换。

如果进行某一趟排序时并没有进行数据交换,则说明所有元素排序完成,可直接跳出循环,结束排序。

优化代码:

 1 public class BubbleSortTest {
 2
 3     public static void main(String[] args) {
 4         int[] intArr;
 5         intArr = new int[]{5,4,3,1,7,8,9};
 6         System.out.println("排序前:");
 7         printList(intArr);
 8         bubbleSortTest(intArr);
 9         System.out.println("排序后:");
10         printList(intArr);
11     }
12     /*冒泡排序核心代码*/
13     private static void bubbleSortTest(int arr[]) {
14         int temp = 0;
15         boolean changeFlag = false;
16
17         for (int i = 0; i < arr.length - 1; i++) {
18             changeFlag = false;
19             for (int j = arr.length - 1; j > i; j--) {
20                 if (arr[j - 1] > arr[j]) {
21                     temp = arr[j - 1];
22                     arr[j - 1] = arr[j];
23                     arr[j] = temp;
24                     changeFlag = true;    //如果数据进行过交换,把changeFlag置为true
25                 }
26             }
27             if(!changeFlag) {
28                 break;    //没有再进行交换,跳出循环
29             }
30             System.out.print("第" + (i+1) + "次排序结果:");
31             printList(arr);
32         }
33     }
34
35     public static void printList(int[] list) {
36         for (int value : list) {
37            System.out.print(value + " ");
38         }
39         System.out.println();
40     }
41 }

运行结果:

此外,这里补充一个通过控制台输入数组进行排序的代码:

 1 import java.util.Scanner;
 2 public class BubbleSort {
 3
 4     public static void main(String[] args) {
 5         Scanner sc = new Scanner(System.in);
 6         System.out.println("请输入要冒泡排序的整数,在同一行以空格隔开:");
 7         String intStr = sc.nextLine();
 8
 9         String[] strArr = intStr.split(" ");
10         int[] intArr = new int[strArr.length];
11
12         for (int i = 0; i < strArr.length; i++) {
13             intArr[i] = Integer.parseInt(strArr[i]);
14         }
15         bubbleSortTest(intArr);
16         System.out.println("排序后:");
17         printList(intArr);
18     }
19
20     private static void bubbleSortTest(int arr[]) {
21         int temp = 0;
22         boolean changeFlag = false;
23
24         for (int i = 0; i < arr.length-1; i++) {
25             changeFlag = false;
26             for (int j = arr.length-1; j > i; j--) {
27                 if (arr[j-1] > arr[j]) {
28                     temp = arr[j-1];
29                     arr[j-1] = arr[j];
30                     arr[j] = temp;
31                     changeFlag = true;
32                 }
33             }
34             if (!changeFlag) {
35                 break;
36             }
37             System.out.print("第" + (i+1) + "次排序结果:");
38             printList(arr);
39         }
40     }
41
42     public static void printList(int[] list) {
43         for (int value : list) {
44            System.out.print(value + " ");
45         }
46         System.out.println();
47     }
48 }
时间: 2024-10-17 22:42:38

java基础之冒泡排序的相关文章

【BigData】Java基础_冒泡排序

1.实现需求 根据已经存在的数组,使用冒泡排序将数组中的元素排序后输出. 2.代码 package cn.test.logan.day02; /** * 冒泡排序在数组上的实现 * @author QIN * */ public class ArrayDemo4 { public static void main(String[] args) { //定义数组并赋值 int[] arr = new int[5]; arr[0]=30; arr[1]=50; arr[2]=20; arr[3]=4

java基础算法之冒泡排序

接触冒泡算法还是大一了,学习C语言的冒泡算法.现在唯一记得就是冒泡与选择了.出来刚刚工作的时候觉的算法基本没撒用处,现在发现这些都是很好的基础.因此自己也准备重新拾起这些知识. 冒泡排序 泡排序是一种很简单的排序的算法,根据名字就可以知道这一个过程,一点点的把大的数移到顶部. 时间复杂度 若文件的初始状态是正序的,一趟扫描即可完成排序.所需的关键字比较次数 和记录移动次数 均达到最小值:  ,  .所以,冒泡排序最好的时间复杂度为 . 若初始文件是反序的,需要进行 趟排序.每趟排序要进行 次关键

java基础(16)、数组的高级应用--冒泡排序、选择排序

数组排序 目录 一. 冒泡排序 二. 选择排序 三. 优化选择排序 一. 冒泡排序 将数组元素按[从小到大排序]为例 思路:依次对临近的两个元素对比,将最大值放在数组最后:再将剩余的元素对比,大值放在剩余元素的最后. . . 以此循环,最后元素就是按从小到大排列. 1.1. 做之前,先了解这个操作:把数组的最大值放在末尾 将元素1和元素2对比,如果元素1的值大,则元素2和元素1的值互换(此时元素2为大值):再让元素2和元素3对比.  . ( 保留大值).  .  元素3和元素4对比 .  . 

java 基础(二)

java 基础(二)java 基础(二) 2016-2-1 by Damon 61. 编写多线程程序有几种实现方式 Java 5以前实现多线程有两种实现方法:一种是继承Thread类:另一种是实现Runnable接口.两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵活. 补充:Java 5以后创建线程还有第三种方式:实现Callable接口,该接口中的

java基础问题总结

1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象. 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类).派生类可以从它的基类那里继承方法和实例变量,并

JAVA基础50题

package package0530; import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.text.DecimalFormat;import java.util.ArrayList;import java.util.Arrays;import java.util.LinkedList;import java.util

java基础知识面试题(41-95)

41.日期和时间:- 如何取得年月日.小时分钟秒?- 如何取得从1970年1月1日0时0分0秒到现在的毫秒数?- 如何取得某月的最后一天?- 如何格式化日期?答:问题1:创建java.util.Calendar 实例,调用其get()方法传入不同的参数即可获得参数所对应的值.Java 8中可以使用java.time.LocalDateTimel来获取,代码如下所示. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public class D

Java基础面试题集(一)

Java基础面试题 一.面向对象编程(OOP) 7 二.常见的Java问题 7 2.1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? 7 2.2.JDK和JRE的区别是什么? 8 2.4.是否可以在static环境中访问非static变量? 8 2.5.Java支持的数据类型有哪些?什么是自动拆装箱? 8 2.6.Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思? 8 2.7.Java中,什么是构造函数?什么是构造函数重载?什么是

Java基础总结2

Java基础总结2 数组 格式1: 元素类型 [] 数组名 = new 元素类型 [元素个数或数组长度] 示例:int [] arr = new int [5] 格式2: 元素类型 [] 数组名 = new 元素类型 [] {元素.元素.元素---..} 示例:int [] arr = new int [5] {1,2,3,4,5} 格式3:元素类型 [] 数组名 = {元素.元素.元素---..} 示例:int [] arr = {1,2,3,4,5} 打印数组角标上的值.遍历数组.打印数组长