java专题——选择排序

package 选择排序;

public class SelectSort {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		 int[] input = new int[]{0,9,1,5,8,3,7,4,6,2};
	        selectSort(input);
	        for(int k : input){
	        	 System.out.print(k + "\t");
	        }
	        System.out.println();
	      int[] input_new = new int[]{0,9,1,5,8,3,7,4,6,2};
	        heapSort(input_new);
	        for(int k : input_new){
	        	 System.out.print(k + "\t");
	        }
	}

	/**
	 * 堆排序
	 * @param input_new
	 */
	private static void heapSort(int[] input_new) {
		// TODO 自动生成的方法存根
		int n = input_new.length-1;//除开数组的哨兵,这里取有效长度
		for(int i=n/2 ; i>=1 ; i--){
			adjustHeap(input_new,i,n);
		}
		for(int i=n ; i>1 ; i--){
			swap(input_new,1,i);
			adjustHeap(input_new,1,i-1);
		}
		
	}

	/**
	 * 调整堆
	 * @param input
	 * @param i 堆顶
	 * @param n 堆长度
	 */
	private static void adjustHeap(int[] input, int i, int n) {
		
		int x = input[i];
		for(int j=i*2 ; j<=n ; j*=2){
			if(j<n && input[j]<input[j+1]){//左右子树节点比较,取较大的索引为j
				j++;
			}
			if(x >= input[j]){//根节点与子节点中的最大值比较,若大,则无需交换
				break;
			}
			input[i] = input[j];//交换值
			i = j;//为循环做准备	
		}
		input[i] = x;//注意经过循环后,i值可能有变,此时的i==j
	}

	/**
	 * 简单选择排序
	 * @param input
	 */
	private static void selectSort(int[] input) {
		int i,j,min;
		for(i=1 ; i<input.length ; i++){
			min = i;
			for(j=i+1 ; j<input.length ; j++){
				if(input[min] > input[j]){
					min = j;
				}
			}
			if(i!=min){
				swap(input,min,i);
			}
		}
	}
	

	private static void swap(int[] input, int min, int i) {
		int temp = input[min];
		input[min] = input[i];
		input[i] = temp;
		
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值