一、前置知识
1. 什么是数据结构
- 数据结构研究的是数据个体和数据各个个体之间关系的存储。
- 从结构上可以划分为逻辑结构(比如下面我要说的二叉树)和物理结构(数组,链表)。
2. 数据结构的组成方式
- 线性结构(数组,链表,队列,栈,哈希表)
- 树 (这里只说树中的二叉树)
• 完全二叉树(二叉堆是其中的一种实现方式,是逻辑结构 ,还有一种二叉查找树,比如红黑树,这里不做解释)
• 满二叉树 - 图
二、堆排序概念
- 堆排序说起来好像很厉害的样子,其实就是就是排序的一种方式,跟冒泡排序的作用是一样的,能将一串无序的数字按照升序或者降序的方式排列出来,此时想一下冒泡就明白了,冒泡是干啥的堆排序就是干啥的,只是效率要比冒泡高一点,实现优雅一点,写出来能让一般不懂的人也是真的一点也看不懂。
- 堆排序其实就是一棵逻辑结构的完全二叉树,二叉树(简单理解二叉,顾名思义就是两个树杈,就是每个节点最多只有两个分支的树)
- 有大顶堆和小顶堆两种实现结构
三、堆排序的实现步骤
- 将一串无序的数字按照大顶堆或者小顶堆的结构构建出一个二叉树堆
- 根据构建的大顶堆或者小顶堆拿到当前序列中的最大值或者最小值
- 将拿到的最大值或者最小值和当前序列中的最后一个值交换,交换完成后并在逻辑上断开连接最后一个值的线(下图中的箭头)
- 重复以上第二、第三步,直到将构建的堆中所有连接的线(下图中的箭头)全部断开
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/56827fb535d9d929778970e890b7495a.png)
四、堆排序代码实现
package com.jst.other;
import java.util.Arrays;
public class HeapSort {
public static void main(String []args){
int []arr = {2,1,4,3,6,5,8,7,10,9};
sort(arr);
System.out.println(Arrays.toString(arr));
}
public static void sort(int []arr){
for(int i=arr.length/2-1;i>=0;i--){
adjustHeap(arr,i,arr.length);
}
for(int j=arr.length-1;j>0;j--){
swap(arr,0,j);
adjustHeap(arr,0,j);
}
}
public static void adjustHeap(int []arr,int i,int length){
int temp = arr[i];
for(int k=i*2+1;k<length;k=k*2+1){
if(k+1<length && arr[k]<arr[k+1]){
k++;
}
if(arr[k] >temp){
arr[i] = arr[k];
i = k;
}else{
break;
}
}
arr[i] = temp;
}
public static void swap(int []arr,int a ,int b){
int temp=arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
}