java算法:选择排序
选择排序:找数组中的最小元素与第一个位置的元素比较交换,然后找第二个最小的元素并与第二个位置的元素比较交换,一直进行下去,直到整个数组排序完毕。
如,对EXAMPLE 字母进行排序:
E X A M P L E
[A] X E M P L E 第一位置最小值A
[A] [E] X M P L E 第二位置剩下最小值E
[A] [E] [E] M P L X 第三位置剩下最小值E
[A] [E] [E] [L] P M X ...
[A] [E] [E] [L] [M] P X
[A] [E] [E] [L] [M] [P] X
[A] [E] [E] [L] [M] [P] [X]
- publicinterfaceItem{
- booleanless(Itemv);
- }
public interface Item{
boolean less(Item v);
}
- publicclassMyItemimplementsItem{
- privateintkey;
- publicbooleanless(Itemv){
- returnkey<((MyItem)v).key;
- }
- publicvoidread(){
- key=newRandom().nextInt();
- }
- publicvoidrand(){
- key=(int)(1000*Math.random());
- }
- publicStringtoString(){
- returnkey+"";
- }
- }
public class MyItem implements Item{
private int key;
public boolean less(Item v){
return key < ((MyItem)v).key;
}
public void read(){
key = new Random().nextInt();
}
public void rand(){
key = (int)(1000 * Math.random());
}
public String toString(){
return key + "";
}
}
- publicclassSelection{
- publicstaticvoidmain(String[]args){
- intn=60;
- MyItem[]a=newMyItem[n];
- for(inti=0;i<n;i++){
- a[i]=newMyItem();
- a[i].rand();
- }
- for(inti=0;i<n;i++){
- System.out.print(a[i]+"");
- }
- selection(a,0,n);
- System.out.println("");
- print(a,n);
- }
- privatestaticvoidprint(MyItema[],intn){
- for(inti=0;i<n;i++){
- System.out.print(a[i]+"");
- }
- }
- publicstaticvoidselection(MyItem[]a,intl,intr){
- for(inti=l;i<r;i++){
- intmin=i;
- for(intj=i+1;j<r;j++){
- if(less(a[j],a[min])){
- min=j;
- }
- }
- exch(a,i,min);
- }
- }
- publicstaticbooleanless(Itemv,Itemw){
- returnv.less(w);
- }
- publicstaticvoidexch(Item[]a,inti,intj){
- Itemt=a[i];
- a[i]=a[j];
- a[j]=t;
- }
- publicstaticvoidcompExch(Item[]a,inti,intj){
- if(less(a[j],a[i])){
- exch(a,i,j);
- }
- }
- }
public class Selection {
public static void main(String[] args) {
int n = 60;
MyItem [] a = new MyItem[n];
for (int i = 0; i < n; i++) {
a[i] = new MyItem();
a[i].rand();
}
for (int i = 0; i < n; i++) {
System.out.print(a[i] + " ");
}
selection(a, 0, n);
System.out.println("");
print(a, n);
}
private static void print(MyItem a [], int n){
for (int i = 0; i < n; i++) {
System.out.print(a[i] + " ");
}
}
public static void selection(MyItem [] a, int l, int r){
for (int i = l; i < r; i++) {
int min = i;
for (int j = i + 1; j < r; j++) {
if(less(a[j], a[min])){
min = j;
}
}
exch(a, i, min);
}
}
public static boolean less(Item v, Item w){
return v.less(w);
}
public static void exch(Item [] a, int i, int j){
Item t = a[i];
a[i] = a[j];
a[j] = t;
}
public static void compExch(Item [] a, int i, int j){
if(less(a[j],a[i])){
exch(a, i, j);
}
}
}
选择排序的缺点是它的运行时间与文件中已排序的数量几乎没有关系。寻找最小元素的一次遍历并不能提供多少关于下一次遍历文件时最小元素位置的信息。可以看到,使用选择排序所花费的时间不管对于随机或已排好都是差不多。不能很好的利用文件中的有序性。