排序之堆排序
2017-08-15 20:24
127 查看
public class HeapSort {
public static void main(String[] args) {
CreateNoOrderArray createNoOrderArray = new CreateNoOrderArray();
int[] array = createNoOrderArray.creat();
System.out.println("Before heap:");
System.out.println(Arrays.toString(array));
heapSort(array);
System.out.println("After heap sort:");
System.out.println(Arrays.toString(array));
}
/**
* 堆排序
* @param array
*/
private static void heapSort(int[] array) {
if (array == null || array.length <= 1) {
return;
}
buildMaxHeap(array);
for (int i = array.length - 1; i >= 1; i--) {
swap(array, 0, i); //每次把最大的换到最后
heapify(array, i, 0); //重新把次大的调整到根节点
}
}
/**
* 构造最大堆
* @param array
*/
private static void buildMaxHeap(int[] array) {
if (array == null || array.length <= 1) {
return;
}
int half = array.length / 2;
for (int i = half; i >= 0; i--) { //从最后一个节点的父节点开始调整,使根节点是最大的
heapify(array, array.length, i);
}
}
/**
* 从index向下调整
* @param array
* @param heapSize
* @param index
*/
private static void heapify(int[] array, int heapSize, int index) {
int left = index * 2 + 1;
int right = index * 2 + 2;
int largest = index;
while(left < heapSize){
if (array[left] > array[index]) {
largest = left;
}
if (right < heapSize && array[right] > array[largest]) {
largest = right;
}
if (index != largest) {
swap(array, index, largest);
}else {
break;
}
index = largest;
left = index * 2 + 1;
right = index * 2 + 2;
}
}
private static void swap(int[] array, int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
public static void main(String[] args) {
CreateNoOrderArray createNoOrderArray = new CreateNoOrderArray();
int[] array = createNoOrderArray.creat();
System.out.println("Before heap:");
System.out.println(Arrays.toString(array));
heapSort(array);
System.out.println("After heap sort:");
System.out.println(Arrays.toString(array));
}
/**
* 堆排序
* @param array
*/
private static void heapSort(int[] array) {
if (array == null || array.length <= 1) {
return;
}
buildMaxHeap(array);
for (int i = array.length - 1; i >= 1; i--) {
swap(array, 0, i); //每次把最大的换到最后
heapify(array, i, 0); //重新把次大的调整到根节点
}
}
/**
* 构造最大堆
* @param array
*/
private static void buildMaxHeap(int[] array) {
if (array == null || array.length <= 1) {
return;
}
int half = array.length / 2;
for (int i = half; i >= 0; i--) { //从最后一个节点的父节点开始调整,使根节点是最大的
heapify(array, array.length, i);
}
}
/**
* 从index向下调整
* @param array
* @param heapSize
* @param index
*/
private static void heapify(int[] array, int heapSize, int index) {
int left = index * 2 + 1;
int right = index * 2 + 2;
int largest = index;
while(left < heapSize){
if (array[left] > array[index]) {
largest = left;
}
if (right < heapSize && array[right] > array[largest]) {
largest = right;
}
if (index != largest) {
swap(array, index, largest);
}else {
break;
}
index = largest;
left = index * 2 + 1;
right = index * 2 + 2;
}
}
private static void swap(int[] array, int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
相关文章推荐
- 比较排序之堆排序和快速排序
- 排序之堆排序
- 插入排序,希尔排序,堆排序详解
- 选择排序之简单选择排序和堆排序
- 【Data_Structure笔记8】排序算法之【选择排序---堆排序】
- 【数据结构】排序番外篇 堆,堆排序与其前身选择排序
- 插入排序、冒泡排序、选择排序、Shell排序、快速排序、归并排序、堆排序
- 快排,堆排序,基数排序手写记录
- 内排序(插入排序、冒泡排序、选择排序、shell排序、快速排序、归并排序、堆排序)
- 经典排序之堆排序
- 选择排序-堆排序
- 【Python排序搜索基本算法】之堆排序
- 算法导论-排序(三) 堆排序
- 排序 堆排序
- 10种算法原理(冒泡排序,选择排序,快速排序,堆排序,希尔排序,桶排序等)
- 选择排序------堆排序
- 排序算法2--简单选择排序、堆排序
- 【数据结构之排序7】堆排序
- 排序与查找实例(五):堆排序
- 程序员必知的8大排序(①直接插入排序②希尔排序③简单选择排序④堆排序⑤冒泡排序⑥快速排序⑦归并排序⑧基数排序)