基本原理也是选择排序,只是不在使用遍历的方式查找无序区间的最大的数,而是通过堆来选择无序区间的最大的数。
注意: 排升序要建大堆;排降序要建小堆。
时间复杂度:O( n * log (n) )
空间复杂度度:O(1)
稳定性:不稳定
public static void heapSort(int[] arr){
//1.先建立堆
createHeap(arr);
//2.需要循环的取出堆顶元素,和最后一个元素交换位置并删除之
// 再从 0 位置进行调整
int heapSize = arr.length;
for(int i = 0; i < arr.length; i++){
//交换 0 号元素和堆的最后一个元素
swap(arr , 0 , heapSize - 1);
//把最后一个元素从堆上删除
heapSize--;
//从 0 号位置开始往下调整
shiftDown(arr,heapSize,0);
}
}
public static void createHeap(int[] arr){
for(int i = (arr.length - 1 - 1) / 2; i >= 0; i--){
shiftDown(arr,arr.length,i);
}
}
public static void shiftDown(int[] arr,int size, int index){
int parent = index;
int child = 2 * parent + 1;
while(child < size){
//先找出左右子树比较大的
if(child + 1 < size && arr[child + 1] > arr[child]){
child = child + 1;
}
//再去比较 child 和 parent
if(arr[parent] < arr[child]){
swap(arr, parent , child);
}else{
break;
}
parent = child;
child = 2 * parent + 1;
}
}
public static void swap(int[] arr ,int x,int y){
int tmp = arr[x];
arr[x] = arr[y];
arr[y] = tmp;
}
实现main函数:
public static void main(String[] args) {
int[] arr = {1,3,5,7,2,9,6,3};
heapSort(arr);
System.out.println(Arrays.toString(arr));
}
常用的正则匹配表达式 正则表达式--验证手机号码:13[0-9]{9} 实现手机号前带86或...
千万级大表如何优化,这是一个很有技术含量的问题,通常我们的直觉思维都会跳转...
如果您的应用程序遇到负载问题,请抽出香槟! 您的网络应用必须相当成功才能进入...
1. 概述 该demo主要实现linux下JSON配置文件的基本操作解析 引用cJSON库的地址为...
随着云计算、大数据、物联网时代的到来,越来越多的网民涌入互联网,越来越多的...
idea2019导入maven项目中的某些问题 idea2019导入maven项目,会出现很多莫名其妙...
SQL在使用过程中,经常会遇到一些奇奇怪怪的小问题,今天给大家总结一下常见的几...
当在代码中更新了数据,并希望等到对应的Dom更新之后,再执行一些逻辑。这时,我...
test.jsp中的代码如下所示 复制代码 代码如下: %@ page language = "java" impor...
一、正则表达式概念: 在计算机科学中,是指一个用来描述或者匹配一系列符合某个...