K smallest Number

K smallest Number

Selection Sort

public class KSmallesFinder {
    public static void main(String[] args) {
    	int ns[]  = {49, 38, 65, 97, 76, 13, 27, 49, 55, 04};
    	//}
		for(int k : findKthSelection(ns, 10)) {
			System.out.println(k);
		}
	}
    
    private static int[] findKthSelection(int[] ns, int k){
    	int[] ks = new int[k];
//    	selection1(ns);
//    	selection2(ns, k);
    	
    	int ns1[] = new int[ns.length + 1];
    	for(int i = 0 ; i < ns.length; i++){
    		ns1[i + 1] = ns[i];
    	}
    	//insertSort1(ns1);
    	//insertSort2(ns);
    	//bubble(ns);
    	shellSor(ns);
    	
    	for(int i = 0 ; i < k; i++){
    		ks[i] = ns[i];
    	}
    	
    	return ks;
    }
    
    private static void selection1(int[] ns){
    	for(int i = 0; i < ns.length; i++){
    		int min = ns[i];
    		int minpos = i;
    		for(int j = i + 1; j < ns.length; j++){
    			if(min > ns[j]){
    				min = ns[j];
    				minpos = j;
    			}
    		}
    		if(i != minpos){
    			swap(ns, i, minpos);
    		}
    	}
    }
    
    private static void swap(int[] ns, int i, int j){
    	int tmp = ns[j];
    	ns[j] = ns[i];
    	ns[i] = tmp;    	
    }
    
    private static void selection2(int[] ns, int k){
    	int count = 0;
    	for(int i = 0; i < ns.length; i++ ){
    		int min = ns[i];
    		int minpos = i;
    		for(int j = i + 1; j < ns.length; j++){
    			if(min > ns[j]){
    				min = ns[j];
    				minpos = j;
    			}
    		}
    		if(i != minpos){
    			swap(ns, i, minpos);
    		}
    		if(++count>k){
    		    break;
    		}
    	}
    }
    
    //ns[0] is standee
    private static void insertSort1(int ns[]){
    	for(int i = 2; i < ns.length; i++){
    		if(ns[i] < ns[i - 1]){
    			ns[0] = ns[i];
    			ns[i] = ns[i - 1];
    			int j = i - 2;
    			for(; (ns[0] < ns[j]); j--){
   					ns[j + 1] = ns[j];
    			}
    			ns[j + 1] = ns[0];
    		}
    	}
    }
    
    
    private static void insertSort2(int ns[]){
    	for(int i = 1; i < ns.length; i++){
    		if(ns[i] < ns[i - 1]){
    			int tmp = ns[i];
    			int j = i - 1;
    			for(; j >= 0&&(ns[j] > tmp ) ; --j){
    				ns[j+1] = ns[j];
    			}
    			ns[j + 1] = tmp;
    		}
    	}
    }
    
    
    private static void bubble(int ns[]){
    	for(int i = 0; i < ns.length - 1; i++){
    		for(int j = 1; j < ns.length - i; j++){
    			if(ns[j - 1] > ns[j]){
    				int tmp = ns[j];
    				ns[j]  = ns[j - 1];
    				ns[j - 1] = tmp;
    			}
    		} 
    	}
    }
    
    private static void shellSor(int ns[]){
    	int delta[] = {4, 3, 2, 1};
    	for(int dk : delta){
    		for(int i = dk ; i < ns.length; i++){
    			for(int j = i -dk; j>= 0; j -=dk){
    				if(ns[j] > ns[i]){
    					int tmp = ns[i];
    					ns[i] = ns[j];
    					ns[j] = tmp;
    				}
    			}
    		}
    	}
    }
}



转载于:https://my.oschina.net/u/138995/blog/270502

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值