java数据结构排序之堆排序算法实现

堆排序的数组实现,由于数组的下标可能从1开始,也可能从0开始,所以要注意,以下代码分两种情况考虑

   1.当数组下标从0开始的时候

public class HeapSort {
	
	static void adjustHeap1(int[] dataList ,int key, int n){//假设数组下标从0开始的情况建堆
	<span style="white-space:pre">	</span>int keyWord = dataList[key];
	<span style="white-space:pre">	</span>for (int i = 2*key+1; i < n; i=i*2+1) {
			if((i+1) < n && dataList[i]<dataList[i+1]){
				i++;
			}
			if(dataList[i]>keyWord){
				dataList[key] = dataList[i];
				key=i;
			}else{
				break;
			}
			dataList[key] = keyWord;
		}
		print1(dataList);
	}
	
	static void print1(int[] dataList){//打印数组
		for (int j = 0; j < dataList.length; j++) {
			System.out.print(dataList[j]+"  ");
		}
		System.out.println();
	}
	public static void main(String[] args) {
		int[] dataList = {0,13,65,97,76,38,27,49,10};
		int size = dataList.length,temp;//数组下标从0开始,建立初始堆
		System.out.println("开始建立初始堆");</span>
		for (int i = size/2-1; i >= 0; i--) {
			System.out.println("i="+i);
			adjustHeap1(dataList, i, size);
		}
		
		System.out.println("调整堆位置");
		
		for (int i = size-1; i >0; i--) {
			temp=dataList[i];
			dataList[i] = dataList[0];
			dataList[0] = temp;
			adjustHeap1(dataList, 0, i-1);
		}
	}
	
}
2.当数组下标从1开始的时候
</pre><pre code_snippet_id="1616856" snippet_file_name="blog_20160320_7_5106729" name="code" class="plain">public class HeapSort {
	
	static void adjustHeap(int[] dataList ,int key, int n){//假设数组下标从1开始
		int keyWord = dataList[key];
		for (int i = 2*key; i < n; i*=2) {
			if(i < n && dataList[i]<dataList[i+1]){
				i++;
			}
			if(dataList[i]>keyWord){
				dataList[key] = dataList[i];
				key=i;
			}else{
				break;
			}
			dataList[key] = keyWord;
		}
		print(dataList);
	}
	
	
	
	static void print(int[] dataList){
		for (int j = 1; j < dataList.length; j++) {
			System.out.print(dataList[j]+"  ");
		}
		System.out.println();
	}
	
	
	public static void main(String[] args) {
		int[] dataList = {0,13,65,97,76,38,27,49,10};//0位置只是占位符
		int size = dataList.length-1,temp;//数组下标从1开始
		System.out.println("开始建立初始堆");
		for (int i = size/2; i > 0; i--) {
			adjustHeap(dataList, i, size);
		}
		System.out.println("调整堆位置");
		for (int i = 0; i < size-2; i++) {
			temp = dataList[size-i];
			dataList[size-i] = dataList[1];
			dataList[1] = temp;
			adjustHeap(dataList, 1, size-i-1);
		}
		
	}
	
}


堆排序和希尔排序有个共同的地方,就是会以待插入元素的关键字,往下找到适合的位置,就是从关键字所在位置开始往下(其子孙节点)找到最适合位置,如果关键字比某个子孙节点所在的位置元素还小,就要把相对应的子孙节点位置与关键字所在位置进行交换,交换后子孙节点所在的位置即为关键字所在位置,依次继续往子孙节点中找,直至关键字所在位置的值比其孩子节点的值都大或关键字已到叶子节点为止。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值