堆排序
序言
排序算法分为:
1、插入排序
2、交换排序
3、选择排序
4、归并排序
5、基数排序
一、介绍大根堆排序
本文主讲选择排序中的大根堆排序。选择排序又包含了两种排序,一个是简单选择排序,另一个则是在简单选择排序的基础上进行改进之后的算法——堆排序。而堆排序又分为大根堆和小根堆。详细可以参考下面的框架图。
选择排序:
1、简单选择排序(不常用)
2、堆排序
2.1、大根堆
2.2、小根堆
本篇博客主要讲解大根堆排序,什么是大根堆???
大根堆实际上是一颗完全二叉树,在完全二叉树的基础上,父节点的关键字要大于左右孩子节点的关键字,这样子的完全二叉树称为大根堆。
实际上小根堆是父节点的关键字要小于左右孩子节点的关键字。
举个例子:
父节点9大于左孩子节点8,大于右孩子节点7;同样父节点8大于左孩子节点6,大于右孩子节点5….依次类推。
二、代码实现
本文使用Java代码实现大根堆排序
2.1、源代码
public class Heapsort {
public void sort(int arr[]) {package com.bubaiwantong.sort;
public class Heapsort2 {
public void sort(int arr[]) {
//首次创建大根堆,需要的时间多一点,后面进行调正就少了许多时间。
for (int i = arr.length / 2 - 1; i >= 0; i--) {
adjust(arr, i, arr.length);
}
for (int i = arr.length - 1; i >= 0; i--) {
swap(arr, 0, i);
adjust(arr, 0, i);
}
}
/**
* 调整大根堆
* @param arr
* @param i
* @param length
*/
public void adjust(int arr[], int i, int length) {
int temp = arr[i];
for (int k = 2 * i + 1; k < length; k = 2 * k + 1) {
if (k + 1 < length && arr[k] < arr[k + 1]) {
k++;
}
if (temp > arr[k]) {
break;
} else {
arr[i] = arr[k];
i = k;
}
}
arr[i] = temp;
}
/**
* 进行交换
* @param arr
* @param i
* @param j
*/
public void swap(int arr[], int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
/**
* 输出排序后的每一个数据
* @param arr
*/
public void printArr(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
/**
* main函数
* @param args
*/
public static void main(String[] args) {
int[] arr = new int[]{9, 8, 7, 6, 5, 4, 3, 2, 1};
Heapsort2 heapsort2 = new Heapsort2();
heapsort2.sort(arr);
heapsort2.printArr(arr);
}
}
for (int i = arr.length / 2 - 1; i >= 0; i--) {
adjust(arr, i, arr.length);
}
for (int i = arr.length - 1; i >= 0; i--) {
swap(arr, 0, i);
adjust(arr, 0, i);
}
}
public void adjust(int arr[], int i, int length) {
int temp = arr[i];
for (int k = 2 * i + 1; k < length; k = 2 * k + 1) {
if (k + 1 < length && arr[k] < arr[k + 1]) {
k++;
}
if (temp > arr[k]) {
break;
} else {
arr[i] = arr[k];
i = k;
}
}
arr[i] = temp;
}
public void swap(int arr[], int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public void printArr(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
public static void main(String[] args) {
int[] arr = new int[]{9, 8, 7, 6, 5, 4, 3, 2, 1};
Heapsort2 heapsort2 = new Heapsort2();
heapsort2.sort(arr);
heapsort2.printArr(arr);
}
}
2.2、输出结果
1 2 3 4 5 6 7 8 9
Process finished with exit code 0
heapsort2.sort(arr);
heapsort2.printArr(arr);
}
}
### 2.2、输出结果
```java
1 2 3 4 5 6 7 8 9
Process finished with exit code 0