自己用Java写了下堆排序…多多指点…
以前我看算法恨不得一天看一百页书,一下掌握好多算法,现在看来还不如慢慢来,一天一个呢…
package com.zk.ds;
import Utils.PrintUtils;
public class Heap {
public static void main(String args[]){
int array[] = {
49,38,65,97,76,13,27,49
};
PrintUtils.printIntArray(array);//用来打印数组的
array = heapSort(array);
PrintUtils.printIntArray(array);//用来打印数组的
}
/**
* 创建堆
* @param array
* @return 创建好的数组
*/
private static int[] buildHeap(int[] array){
for(int i=array.length/2; i>0; --i){
array = heapAdjust(array, i, array.length);
}
return array;
}
/**
* 调整堆
* @param array 待调整的数组
* @param index 调整数组中的第几个数 index = [1,2...array.length]
* @param len 当前需要调整数组的前多少个项 len = [1,2...array.length]
* @return 调整好的数组
*/
private static int[] heapAdjust(int[] array, int index, int len){
int halfLen = len >> 1;
while(index <= halfLen){
int i = index;
if((i << 1) + 1 <= len){
i = minIndex(array, (i << 1) - 1, i << 1);
++i;
}else{
i = (i << 1);
}
if(array[index - 1] > array[i - 1]){
swap(array, index - 1, i - 1);
}
index = i;
}
return array;
}
/**
* 堆排序
* @param array
* @return 排好序的数组
*/
public static int[] heapSort(int[] array){
int[] heap = buildHeap(array);
for(int i=array.length; i>0; --i){
swap(heap, 0, i-1);
heap = heapAdjust(heap, 1, i-1);
}
return heap;
}
/**
* 交换array数组中指定索引处的两个值
* @param array
* @param indexA 索引A
* @param indexB 索引B
*/
private static void swap(int array[], int indexA, int indexB){
int temp = array[indexA];
array[indexA] = array[indexB];
array[indexB] = temp;
}
/**
* 确定array数组中indexA处的值小,还是indexB中的值小
* @param array 数组
* @param indexA 索引A
* @param indexB 索引B
* @return 两个索引所存储的值较小的索引
*/
private static int minIndex(int array[], int indexA, int indexB){
if(array[indexA] <= array[indexB]){
return indexA;
}else{
return indexB;
}
}
}