/*看算法4,第二章内容摘录。*/
//排序算法类的模板
package paixu;
public class Example {
//排序
public static void sort(Comparable[] a){
}
//判断v是否小于w
protected static boolean less(Comparable v,Comparable w){
return v.compareTo(w)<0;
}
//交换a[i]和a[j]
protected static void exch(Comparable[] a,int i,int j){
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
//单行打印数组
protected static void show(Comparable[] a){
for(int i=0; i<a.length; i++){
System.out.print(a[i]+" ");
}
System.out.println();
}
//测试数组是否有序
public static boolean isSorted(Comparable[] a){
for(int i=1; i<a.length; i++){
if(less(a[i],a[i-1])) return false;
}
return true;
}
}
Comparable接口在java.lang包中,实现该接口需要重写
public int compareTo(Object o)
//定义一个可以比较的数据类型:日期Data
package paixu;
public class Data implements Comparable<Data>{
private final int day;
private final int month;
private final int year;
public Data(int d,int m,int y){
day = d; month = m; year = y;
}
public int day() { return day; }
public int month() { return month; }
public int year() { return year; }
public int compareTo(Data that) {
if(this.year > that.year) return +1;
if(this.year < that.year) return -1;
if(this.month > that.month) return +1;
if(this.month < that.month) return -1;
if(this.day > that.day) return +1;
if(this.day < that.day) return -1;
return 0;
}
public String toString(){
return month+"/"+day+"/"+year;
}
}
/*选择排序
* 思想: 首先找到数组中的最小元素,将它和数组第一个元素交换位置。
* 再次,在剩下的元素中找到最小的元素,将它和第二个数组元素交换位置。如此往复,直到将整个数组排序
* 时间复杂度:对于长度为N的数组,选择排序需要大约N²/2次比较和N次交换
* 特点: 1.运行时间和输入无关。 每次都要扫描数组找出最小元素,然后交换。
* 2.数据移动是最少的 选择排序只用N次交换——交换次数与数组大小是线性关系。
* */
package paixu;
public class Selection extends Example{
public static void sort(Comparable[] a){
int N = a.length;
for(int i=0; i<N-1; i++){
int min = i;
for(int j=i+1; j<N; j++){
if(less(a[j],a[min])) min=j;
}
exch(a,i,min);
}
}
public static void main(String[] args) {
Selection s = new Selection();
String[] a = {"ddd","bbb","ccc","aaa"};
s.sort(a);
Example.show(a);
}
}