java算法:选择排序

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]

Java代码 复制代码
  1. publicinterfaceItem{
  2. booleanless(Itemv);
  3. }
public interface Item{
	boolean less(Item v);
}
Java代码 复制代码
  1. publicclassMyItemimplementsItem{
  2. privateintkey;
  3. publicbooleanless(Itemv){
  4. returnkey<((MyItem)v).key;
  5. }
  6. publicvoidread(){
  7. key=newRandom().nextInt();
  8. }
  9. publicvoidrand(){
  10. key=(int)(1000*Math.random());
  11. }
  12. publicStringtoString(){
  13. returnkey+"";
  14. }
  15. }
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 + "";
	}
}
Java代码 复制代码
  1. publicclassSelection{
  2. publicstaticvoidmain(String[]args){
  3. intn=60;
  4. MyItem[]a=newMyItem[n];
  5. for(inti=0;i<n;i++){
  6. a[i]=newMyItem();
  7. a[i].rand();
  8. }
  9. for(inti=0;i<n;i++){
  10. System.out.print(a[i]+"");
  11. }
  12. selection(a,0,n);
  13. System.out.println("");
  14. print(a,n);
  15. }
  16. privatestaticvoidprint(MyItema[],intn){
  17. for(inti=0;i<n;i++){
  18. System.out.print(a[i]+"");
  19. }
  20. }
  21. publicstaticvoidselection(MyItem[]a,intl,intr){
  22. for(inti=l;i<r;i++){
  23. intmin=i;
  24. for(intj=i+1;j<r;j++){
  25. if(less(a[j],a[min])){
  26. min=j;
  27. }
  28. }
  29. exch(a,i,min);
  30. }
  31. }
  32. publicstaticbooleanless(Itemv,Itemw){
  33. returnv.less(w);
  34. }
  35. publicstaticvoidexch(Item[]a,inti,intj){
  36. Itemt=a[i];
  37. a[i]=a[j];
  38. a[j]=t;
  39. }
  40. publicstaticvoidcompExch(Item[]a,inti,intj){
  41. if(less(a[j],a[i])){
  42. exch(a,i,j);
  43. }
  44. }
  45. }
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);
		}
	}
}

选择排序的缺点是它的运行时间与文件中已排序的数量几乎没有关系。寻找最小元素的一次遍历并不能提供多少关于下一次遍历文件时最小元素位置的信息。可以看到,使用选择排序所花费的时间不管对于随机或已排好都是差不多。不能很好的利用文件中的有序性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值