对排序非递归实现 java

public class HeapOperation {
	/*
	 * 建立堆时只需要保证根结点小于两个子结点或者大于两个子结点,对两个子结点大小没有要求
	 */

	public static void main(String[] args) {
		int index;
//		int[] arr={-3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
		int[] arr={9,8,7,6,5,4,3,2,1,0,-1,-2,-3};
		show(arr);
		
		heap_sort(arr,13);
		show(arr);
	}
	public static void show(int[] arr){
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]+" ");
		}
		System.out.println();
	}
	public static void heap_sort(int[] arr,int len){
		int p;
		int end;
		for(p=(len-1-1)/2;p>=0;p--){
			adjustDown(arr,p,len-1);
		}
		for(end=len-1;end>=1;end--){
			swap(arr,0,end);
			adjustDown(arr, 0, end-1);
		}
	}
	public static void adjustDown(int[] arr,int i,int end){
		int key=arr[i];
		int p=i;
		//TODO
		int left=2*p+1;
		//越界就是没有孩子   只要能进循环就一定是有孩子的
		while(left<=end){
			//有右孩子的情况下,大于等于左右孩子不用换
			if((key>=arr[left])&&(left+1<=end&&key>=arr[left+1])){
				break;
			
			}else if(key>=arr[left]&&left+1>end){//没有右孩子,只有左孩子,且大于等于左孩子不用换
				break;
			}else if(left+1<=end &&arr[left+1]>=arr[left]&&key<arr[left+1]){
				swap(arr,p,left+1);//与右孩子换。要保证有右孩子,且右孩子大于等于左孩子,父亲小于右孩子
				p=left+1;
				left=2*p+1;
			}else if(left+1<=end &&arr[left]>arr[left+1]&&key<arr[left]){
				swap(arr,p,left);
				p=left;//父亲与谁换,就到谁的位置了
				left=2*p+1;//父亲新的左孩子的位置
			}else if(left+1>end&&arr[left]>key){
				swap(arr,p,left);//与左孩子换。没右孩子的情况下,只需父亲小于左孩子
				p=left;
				left=2*p+1;
			}
		}
	}
	public static void swap(int[] arr,int p,int q){
		int temp=arr[p];
		arr[p]=arr[q];
		arr[q]=temp;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值