常用排序算法-堆排序

一:主要的思想

堆排序是简单选择排序的改进,我们在简单选择排序中只找到最小的元素,没有找到次小的元素,关键码的次数比较较多

堆排序主要的步骤是将待排序序列构造成一个堆,堆顶元素就是最大值或者最小值,然后将堆顶元素和堆左后一个元素交换,再次建堆

二:问题

1:怎能建堆

2:如何让处理堆顶记录

三问题解决

1:建堆就是个不断赛选的过程,将待赛选节点分别与左右节点比较

2:,然后将堆顶元素和堆左后一个元素交换,再次建堆

四:程序源代码

package com.ccut.heapSort;

import java.util.Arrays;

/**
 * 
 * 堆排序
 *
 */
public class HeapSort {
	public static void main(String[] args) {
		   int[] arr = {0, 12, 15, 9, 20, 6, 31, 24};
	        heapSort(arr);
	        System.out.println("堆排序后  " + Arrays.toString(arr));
	}

	private static void heapSort(int[] arr) {
	  //初始建堆
		for (int i =(arr.length-1)/2; i>=0; i--) 
		  sift(arr,i,arr.length);
		
		for (int i = arr.length-1; i >0; i--) {
			int temp=arr[0];
			arr[0]=arr[i];
			arr[i]=temp;
		     sift(arr,0,i);
		}
	
		
	}
	
	/**
	 * 
	 * @param arr 数组首地址
	 * @param selectNum :待筛选记录
	 * @param length 数组长度
	 */
	private static void sift(int arr[],int selectNum,int length) {
		//暂存要筛选的元素
		int temp=arr[selectNum];
		
		for(int i = selectNum*2; i < length; i=i*2) {
			//i指向左右节点最大的那个
			if(i<length&&arr[i]<arr[i+1])
               i++;	
			//跟节点小于字树,将字数移动到根接单处,继续将temp和子树的作用字数想比较
			if (i<length&&temp<arr[i]) {
				arr[selectNum]=arr[i];
				selectNum=i;
			}else {
				//
				break;
			}
			arr[selectNum]=temp;
		}
	}

	
}

五:时间复杂度分析

最好最坏(olog(nlog (2 n)) n倍以二为底n的对数


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值