堆排序的思想也是用了分治原则,这里涉及到最大堆相关知识,在此不做过多介绍。主要进行代码上的实现。
需要的函数:
- swap(int[] a,int i1,int i2) :交换数值。
- maxHeap(int[] a,int heapSize,int i):调整i以下的元素为最大堆。
- buildHeap(int[] a):构建最大堆
- heapSort(int[] a):通过递归进行排序。
所有代码如下:
package com.xpn.sort;
public class HeapSort {
/**
* @param args
*/
public static void main(String[] args) {
int[] array = { 9, 1, 4, 6, 7, 8, 3, 2, 1, 0, -1, -2, -3 };
heapSort(array);
for (int i : array) {
System.out.println(i);
}
}
public static void swap(int[] a,int index1,int index2){
int tmp=a[index1];
a[index1]=a[index2];
a[index2]=tmp;
}
//最大堆调整,heapSize,当前调整的数量
public static void maxHeap(int[] a,int heapSize,int index) {
int left=index*2+1;
int right=index*2+2;
int largest=index;//顶节点
//获取到最大的值,并进行交换,保持最大堆的结构
if(left<heapSize&&a[left]>a[index])
largest=left;
if(right<heapSize&&a[right]>a[largest])
largest=right;
if(largest!=index){
swap(a, largest, index);
maxHeap(a, heapSize, largest);
}
}
public static void buildHeap(int[] a){
if(a==null||a.length<=1)
return;
int half=a.length/2;
for(int i=half;i>=0;i--){
maxHeap(a, a.length, i);
}
}
//排序过程:1)建立最大堆。2)提取堆顶元素放在数组末尾。3)调整前面的堆结构
public static void heapSort(int[] a) {
if(a==null||a.length<=1)
return;
buildHeap(a);
for(int i=a.length-1;i>0;i--){
swap(a, 0, i);
maxHeap(a, i, 0);//始终调整0元素,下沉法
}
}
}