排序--冒泡排序(java语言实现)

一.排序算法

排序是在日常生活中需要经常面对的问题,价格,年龄,身高等等。而对于排序算法,又有常见的冒泡排序,简单选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等等。在学习了程杰的《大话数据结构》之后,由于其是基于C语言编写,所以自己根据提供的思路基于Java语言来对各种算法实现。

二.如何测试自己所写代码的正确性

简单来说,比如一个数列{5,3,6,9,4,7},在自己设计的排序算法之后,进行简单测试之后,按递增的顺序排成了{3,4,5,6,7,9}。而如果进行大规模样本测试之后,假若出现了排序出错的情况,如上个数列排成了{4,3,5,6,7,9}。即无论规模大小,样本数量大小,排序始终都能给出正确的结果,这样代码才算是写正确了。而如何进行对自己代码进行大规模测试,就用到了对数器。

对数器

对数器的概念和使用
(1)有一个你想要测试的方法a
(2)有一个或者自己实现一个绝对正确(暂不考虑复杂度)的方法b-----比如Java语言的库中自带数列排序,它就是绝对正确的
(3)设计一个随机样本产生器(规模随机,数列元素大小随机)
(4)定义比对方法
(5)方法a与方法b对比很多次来看方法b是否正确
(6)只要有一个样本对比出错,打印出来看看,是哪里出了问题
(7)再进行大样本数量测试之后,仍然没有对比错误,自己所写排序代码就是正确的

冒泡排序

冒泡排序是最简单的排序,思路并不复杂,两两比较,先第一个元素与之后所有元素进行比较,如果比后面元素大则交换,然后第二个元素执行同样的操作,直到倒数第二个元素与最后一个元素比较完成结束。最简单的思路两个变量i,j。i从第一个遍历到倒数第二个元素,j从i+1元素开始遍历,到最后一个。代码如下:

public static void bubbleSort(int[] arr){
        if(arr==null || arr.length == 1){
            return;
        }
        for(int i = 0;i arr[j])
                    swap(arr,i,j);
            }
        }
    }

swap是元素交换函数,定义如下:

   public static void swap(int[] arr,int i,int j){
        if(arr == null || i == j){
            return;
        }
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

对数器的实现

首先是随机数组产生器

	/**
     * 随机数组产生器
     */
    public static int[] generateRandomArray(int maxSize,int maxValue){		//最大元素个数,元素最大值
        int size  = (int)((maxSize+1)*(Math.random()));
        int[] arr = new int[size];
        
        for(int i = 0;i

之后是比对方法

	/**
     * 比对方法
     */
    public static boolean isEqual(int[] trueArr,int[] testArr){
        if(trueArr==null || testArr==null){			//两者均为空
            return true;
        }

        if((trueArr==null && testArr !=null)||(trueArr!=null && testArr ==null)){  		//两者有其一为空
            return false;
        }

        if(trueArr.length!=testArr.length){			//先比对长度
            return false;
        }

        for (int i=0;i

这样之后就可以进行代码的测试,最终代码如下:

package SortTest;

import java.util.Arrays;

public class BubbleTest {
    public static void main(String[] args) {
        int testTimes = 1000;			//测试次数1000次

        for(int i=0;i arr[j])
                    swap(arr,i,j);
            }
        }
    }

    public static void swap(int[] arr,int i,int j){
        if(arr == null || i == j){
            return;
        }
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void printArray(int[] arr){
        if(arr == null){
            return;
        }
        System.out.print("[");
        for(int i = 0;i

在输出栏看下结果:
排序--冒泡排序(java语言实现)_第1张图片
这样实现的冒泡排序也是有一定的缺陷的,如数列{9,1,5,8,3,7,4,6,2},前两个元素确定之后,3会被换到最后一位,因此效率上是有点低的,至于如何修改,请看下个博客或者程杰的《大话数据结构》。

你可能感兴趣的:(算法)