排序是在日常生活中需要经常面对的问题,价格,年龄,身高等等。而对于排序算法,又有常见的冒泡排序,简单选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等等。在学习了程杰的《大话数据结构》之后,由于其是基于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
在输出栏看下结果:
这样实现的冒泡排序也是有一定的缺陷的,如数列{9,1,5,8,3,7,4,6,2},前两个元素确定之后,3会被换到最后一位,因此效率上是有点低的,至于如何修改,请看下个博客或者程杰的《大话数据结构》。