目录
堆排序简介
- 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。
- 堆是具有以下性质的完全二叉树:
- 每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;
- 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆 ;
- 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。
其实就是利用堆这种数据结构,不断将最大的数据沉底(放入数组末尾),然后继续处理除这个元素外的其他元素。
![](https://img-blog.csdnimg.cn/44c4b536248e420888d4b3fac1ad4df6.png)
堆排序基本思想
- 首先根据我们的需求,将一个待排序的数组调整成为大顶堆(小顶堆);
- 此时整个数组的最大值就是调整过后的树的根节点;
- 然后将其与末尾元素进行交换,将最大的数放入到数组末尾(此时再调整和排序时该数不再参加);
- 然后再将剩余的n-1个数继续调整成为大顶堆,继续交换;
堆排序的代码实现
package com.HeapSort;
import java.util.Arrays;
/**
* @author shkstart
* @create
*/
public class HeapSort {
public static void main(String[] args) {
int[] arr = new int[]{3,9,5,10,6};
Heap_sort(arr);
}
//堆排序实现
public static void Heap_sort(int[] arr){
int temp = 0;
for (int i = arr.length / 2 - 1; i >= 0; i--) {
adjustHeap_big(arr, i, arr.length);
}
//交换的代码
for (int j = arr.length - 1; j > 0; j--) {
temp = arr[j];
arr[j] = arr[0];
arr[0] = temp;
//每交换一次,就要重新 调整一次
adjustHeap_big(arr, 0, j);
}
System.out.println("堆排序后:" + Arrays.toString(arr));
}
//将一个数组调整成大顶堆
public static void adjustHeap_big(int[] arr , int i , int length){
int temp = arr[i]; // 将当前的数值存储下来
for(int k = i * 2 + 1 ; k < length ; k = i * 2 + 1){
if(k + 1 > arr.length - 1 && arr[k] < arr[k+1]){
k++; //如果左子节点小于右子结点,则将k指向右子结点
}
if(arr[k] > temp/*temp存放的就是arr[i]原来的值*/){
arr[i] = arr[k];
i = k;
}else{
break;
}
}
//循环结束后,将arr[i]原来的值放入到新的位置
arr[i] = temp;
}
}
代码解析
![ohh](https://img-blog.csdnimg.cn/img_convert/b7fc8d5e9de04fe8e48a509c953fa67e.jpeg)