前言
java中排序通过Comparable接口实现,Integer、Double、String、Date、File等都实现了Comparable接口,此类数据类型可以通过v.compareTo(w)
进行比较。在研究排序算法时的成本模型为比较和交换的数量,一些不存在交换的算法通过访问数组的次数进行统计
选择排序
/*
* name:选择排序
*
* 成本模型:交换和比较的次数,如果没有则使用数组访问的次数
* 策略:通过循环找出最小的值并与第一个值交换,接着在剩下的
* 值中找出最小的值并与第二个进行交换,以此类推,每次
* 选择出最小的值,所以被称为选择排序
*
* 分析:内循环每次会进行N-i-1次比较和一次交换,所以整体会进行N次数组交换和N²/2次比较
*
* Input:S O R T E X A M P L E
*
* 增长数量级:N²/2
* */
public class Selection {
public static void sort(Comparable[] a){
int N = a.length;
for(int i=0;i<N;i++){
int min = i;
for(int j=i+1;j<N;j++)
if(less(a[j],a[min])) min = j;
exch(a,i,min);// 交换
}
}
private static boolean less(Comparable v,Comparable w){
return v.compareTo(w)<0;
}
private static void exch(Comparable[] a,int vIndex,int wIndex){
Comparable temp = a[vIndex];
a[vIndex] = a[wIndex];
a[wIndex] = temp;
}
private static void show(Comparable[] a){
for(int i=0,len=a.length;i<len;i++)
StdOut.print(a[i]+" ");
StdOut.println();
}
private static boolean isSorted(Comparable[] a){
for(int i=1,len=a.length;i<len;i++)
if(less(a[i],a[i-1])) return false;
return true;
}
public static void main(String[] args){
String[] a = new In(args[0]).readAllStrings();
sort(a);
assert isSorted(a);
show(a);
}
}
实现策略
通过循环找出最小的元素并与第一个元素进行交换,接着在剩下的元素中找出最小的元素并且与第二个元素进行交换,以此类推进行排序
分析
整体增长数量级是平方级别,在“比较和交换”这样的成本模型下,会进行N-i-1次比较操作less(a[j],a[min])
,N-1+N-2+…+2+1~N²/2,会进行N次交换操作exch(a,i,min)
,所以整体增长数量级为N²/2。整体运行时间不依赖于输入,只要是相同的大小,运行时间是相同的。