----------------排序算法-之选择排序-------------

=======书瓖果========

定义:首先,找到数组中最小的那个元素,其次,将它和数组中的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。再次

结论:对于长度为N的数组,选择排序需要大约N2/2次比较和N次交换。

《算法基础》给出的伪码:

void selectionsort(int n, keytype s[]) {
    index i. j, smallest;
    for(i = 1; i <= n-1; i++) {
    smallest = i;
    for(j = i+1; j <= n; j++) {
        if(S[j] < S[smallest]) {
            smallest = j;
        }
           交换S[i] 和 S[smallest];
    }
}

 

《算法》实现:

/**
 * @author shuxiangguo
 * @time 2016/07/24
 * */
public class Selection {
	public static void sort(Comparable[] a) {
		//将a[]按升序排列
		int N = a.length;//数组长度
		for(int i = 0; i < N; i++) {
			//将a[i] 和 a[i+1..N]中最小的元素交换
			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 i, int j) {
		Comparable t = a[i];
		a[i] = a[j];
		a[j] = t;
	}
	private static void show(Comparable[] a) {
		//在单行中打印数组
		for(int i = 0; i < a.length; i++) {
			StdOut.print(a[i] + " ");
		}
		StdOut.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;
		}
		public static void main(String[] args) {
			//从标准输入读取字符串,将它们排序输出
			String[] a = In.readStrings();
			sort(a);
			assert isSorted(a);
			show(a);
		}
	}

 

posted @ 2016-07-24 23:14  shuxiangguo  阅读(124)  评论(0编辑  收藏  举报