Java学习笔记排序算法-------冒泡排序

来源:互联网 发布:不出门便知天下事言语 编辑:程序博客网 时间:2024/05/28 05:16

    今天开始使用Java写几个排序算法,这是第一个排序算法-----冒泡排序,这个应该是最简单容易理解的排序算法了,本科的时候接触到这个是使用C写的,现在简单回顾一下冒泡排序的基本思想:冒泡排序就是从给定数列的首部开始依次比较它和下一个值的大小,如果a[1]>a[i+1]就继续往前走,否则的话需要交换一下a[i]和a[i+1]的值,实现前者比后者的值小的目的,这样经过一轮的排序之后相邻的数据都是前者大于后者的排列,接下来循环进行下去,每一轮的过程中较小的数都会慢慢被交换到数组的尾部,就像是“浮上来”一样,冒泡排序也因此得名。

数组a为原始待排序的数组a=[9,8,7,2,5,6,4,1,56,12,14,36,89,78,45],则每一轮的结果为:

9,8,7,2,5,6,4,1,56,12,14,36,89,78,45,------------->原始数组
89,8,7,2,5,6,4,1,9,12,14,36,56,78,45,
89,78,7,2,5,6,4,1,8,9,12,14,36,56,45,
89,78,56,2,5,6,4,1,7,8,9,12,14,36,45,
89,78,56,45,2,5,4,1,6,7,8,9,12,14,36,
89,78,56,45,36,2,4,1,5,6,7,8,9,12,14,
89,78,56,45,36,14,2,1,4,5,6,7,8,9,12,
89,78,56,45,36,14,12,1,2,4,5,6,7,8,9,
89,78,56,45,36,14,12,9,1,2,4,5,6,7,8,
89,78,56,45,36,14,12,9,8,1,2,4,5,6,7,
89,78,56,45,36,14,12,9,8,7,1,2,4,5,6,
89,78,56,45,36,14,12,9,8,7,6,1,2,4,5,
89,78,56,45,36,14,12,9,8,7,6,5,1,2,4,
89,78,56,45,36,14,12,9,8,7,6,5,4,1,2,
89,78,56,45,36,14,12,9,8,7,6,5,4,2,1,-------------->结果数组

程序如下:

//BubbleSort.java

class BubbleSort{public static void main(String[] args) {//int[] a = {2,1,8,9};int[] a = {2,1};swap(a);print(a);int[] num_list = {9,8,7,2,5,6,4,1,56,12,14,36,89,78,45};System.out.println("排序之前的列表为---------->");print(num_list);bubbleSort(num_list);System.out.println("排序之后的列表为---------->");print(num_list);System.out.println("排序之后正序输出列表为---------->");reverseprint(num_list);}public static void print(int[] numbers)    {        for(int i = 0 ; i < numbers.length ; i ++ )        {        System.out.print(numbers[i] + ",");        }        System.out.println("");    }public static void reverseprint(int[] numbers){    for(int i=numbers.length-1; i>=0; i--){    System.out.print(numbers[i] + ",");}    System.out.print("");}public static void swap(int[] a){if (a == null || a.length != 2){throw new IllegalArgumentException();}     int temp; // 记录临时中间值  temp = a[0]; a[0] = a[1]; a[1] = temp;}public static void bubbleSort(int[] numbers) {     int size = numbers.length; // 数组大小       for (int i = 0; i < size - 1; i++) {           for (int j = i + 1; j < size; j++) {             if (numbers[i] < numbers[j]) { // 交换两数的位置        //int temp = numbers[i];                   //numbers[i] = numbers[j];                   //numbers[j] = temp;                  int a[] = new int[2];a[0]=numbers[i];a[1]=numbers[j];swap(a);numbers[i]=a[0];numbers[j]=a[1];            }          } print(numbers);    }   }}
程序很简单,不用多解释都可以看明白,我想多说的是在java中交换两个整数这里,不得不说真是个坑,之前学C后来学python,没有遇上过Java这样别扭的处理两个整数的交换问题,之前是这么写的:

 public static void swap(int a,int b){ //值参数传递不能实现交换两个整数
  int temp;
  temp = a;
  a = b;
  b = t;
  }
后来编译的时候一直报错,就是不能通过,无奈只好开始查资料,毕竟Java对于我完全是一个新东西,后来得知:在java中值参数传递不能实现交换两个整数,算是明白了怎么回事了,接下来就开始想新的处理办法,如上:在实现两个数的交换的时候我用了两种方法,当然被注释掉的三行代码这种方法是比较常见也是比较简单的,Java可以利用数组来实现两个整数的交换,所以在这里就尝试了另一种方法,也就是swap()函数,原理很简单,在swap()函数中设置了抛出异常的条件,当数组为空或者长度不为2时抛出异常,如下是运行提示:

Exception in thread "main" java.lang.IllegalArgumentException
        at BubbleSort.swap(BubbleSort.java:35)
        at BubbleSort.main(BubbleSort.java:6)

接下来是程序运行结果:

1,2,
排序之前的列表为---------->
9,8,7,2,5,6,4,1,56,12,14,36,89,78,45,
89,8,7,2,5,6,4,1,9,12,14,36,56,78,45,
89,78,7,2,5,6,4,1,8,9,12,14,36,56,45,
89,78,56,2,5,6,4,1,7,8,9,12,14,36,45,
89,78,56,45,2,5,4,1,6,7,8,9,12,14,36,
89,78,56,45,36,2,4,1,5,6,7,8,9,12,14,
89,78,56,45,36,14,2,1,4,5,6,7,8,9,12,
89,78,56,45,36,14,12,1,2,4,5,6,7,8,9,
89,78,56,45,36,14,12,9,1,2,4,5,6,7,8,
89,78,56,45,36,14,12,9,8,1,2,4,5,6,7,
89,78,56,45,36,14,12,9,8,7,1,2,4,5,6,
89,78,56,45,36,14,12,9,8,7,6,1,2,4,5,
89,78,56,45,36,14,12,9,8,7,6,5,1,2,4,
89,78,56,45,36,14,12,9,8,7,6,5,4,1,2,
89,78,56,45,36,14,12,9,8,7,6,5,4,2,1,
排序之后的列表为---------->
89,78,56,45,36,14,12,9,8,7,6,5,4,2,1,
排序之后正序输出列表为---------->
1,2,4,5,6,7,8,9,12,14,36,45,56,78,89,

可以看到:程序实现了对原始数据的排序输出,冒泡排序就说这么多。

0 0