《算法(第四版)》排序-----选择排序


选择排序从字面的解释就是先从一个数组中选择出一个,然后再按照一定规则选择出一个,直到全选择完,也就拍完序了。

具体解释如下:(以升序为例)

step1:先取出数组的第一个元素a[0],然后再后面是所有数据选择,只要有比a[0]小的值,那就把最小值的坐标更新,等全部比较完,把a[0]和a[min]交换

step2:在取出a[1],按照第一步的规律,在a[1]后面找比a[1]小的,然后把最小值的坐标进行更新,直到全部比较完,将a[1] 和a[min]换

step3:按照规律进行下去,哪怕a[i]已经是最小的了,那么也要a[i]和a[i]换,直到把所有数据都交换完


由算法可知:对于长度为N的数组,选择排序需要大约N^2/2次比较(相当于一个方阵的右对角线的半面全部比较了一遍),交换需要N次

选择排序的运行时间与数组输入的初始化顺序无关

具体实现如下

public static <T> void sort(Comparable<t> 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;
            
        }<pre name="code" class="java">        exch(a,i,min);
}}
 测试程序如下: 

</pre><pre>
public class Selection {
	public static <T> void sort(Comparable<T>[] 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 <T>boolean less(Comparable<T> v, Comparable<T> w){
		return v.compareTo((T) w) < 0;
	}
	private static <T> void exch(Comparable<T>[] a, int i, int j){
		Comparable<T> t = a[i];
		a[i] = a[j];
		a[j] = t;
	}
	private static <T> void show(Comparable<T>[] a){
		//在单行中打印数组
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i] + " ");
		}
	}
	public static <T> boolean isSorted(Comparable<T>[] a){
		//测试数组元素是否有序
		for (int i = 0; i < a.length; i++) {
			if(less(a[i], a[i-1]))
				return false;
		}
		return true;
	}
	public static void main(String[] args) throws FileNotFoundException {
		// TODO Auto-generated method stub
//		String[] a = {"S","O","R","T","E","X","A","M","P","L","E"};
		Integer[] a = {-5,8,9,5,7,1,-68,1,5,33,100,563,526,16,21,68,-88};
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i] + " ");
		}
		System.out.println();
		sort(a);
		assert isSorted(a);
		show(a);
		
	}
}


测试结果

S O R T E X A M P L E 
A E E L M O P R S T X 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值