一:主要的思想
堆排序是简单选择排序的改进,我们在简单选择排序中只找到最小的元素,没有找到次小的元素,关键码的次数比较较多
堆排序主要的步骤是将待排序序列构造成一个堆,堆顶元素就是最大值或者最小值,然后将堆顶元素和堆左后一个元素交换,再次建堆
二:问题
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的对数