这段时间复习了基本的排序算法,但是写的比较杂乱,看了《算法》一书后,觉得这样以模板类的形式写的排序算法很不错,在这做一个排序算法的总结吧。
接下来,会在Example上具体的实现Shell排序、选择排序、插入排序、归并等算法。
排序算法的目的是所有元素的主键按照某种方法排列。在java中元素基本上是对象,对主键的描述一般是通过实现comparable的接口来完成的。
在模板类Example中,我们约定
sort() 排序算法
less() exch() 辅助函数
show()打印
main() 测试
time()算法运行时间
package com.acm.algorihm;
import java.util.Arrays;
import java.util.Random;
import java.util.RandomAccess;
public abstract class Example {
/**
* 待实现算法
* @param a
*/
public abstract void sort(Comparable[] a);
/**
* a是否小于b
* @param a
* @param b
* @return
*/
protected static boolean less(Comparable a, Comparable b) {
return a.compareTo(b) < 0;
}
/**
* 交换数组a中第i个和第j个元素
* @param a
* @param i
* @param j
*/
protected static void exch(Comparable[] a, int i, int j) {
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
/**
* 打印数组
* @param a
*/
protected static void show(Comparable[] a) {
System.out.println(Arrays.toString(a));
}
/**
* 数组是否有序
* @param a
* @return
*/
protected static boolean isSorted(Comparable[] a) {
for (int i = 1; i < a.length; i++) {
if (less(a[i], a[i - 1]))
return false;
}
return true;
}
/**
* 返回排序运行时间
* @param a
* @return
*/
protected double time(Comparable[] a) {
double startTime = System.currentTimeMillis();
sort(a);
double endTime = System.currentTimeMillis();
return endTime - startTime;
}
/**
* 返回一个长度为N的最大值小于max的integer类型的乱序数组
* @param size size > 500 会出问题?
* @param max
* @return
*/
protected static Integer[] testDate(int size, int max) {
Integer[] data = new Integer[size];
Random random = new Random();
for (int i = 0; i < size; i++) {
data[i] = random.nextInt(max);
}
return data;
}
}