IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> java堆排序算法 -> 正文阅读

[数据结构与算法]java堆排序算法

java堆排序算法

排序思想
1.首先将待排序的数组构造成一个大根堆,此时,整个数组的最大值就是堆结构的顶端

2.将顶端的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序数组个数为n-1

3.将剩余的n-1个数再构造成大根堆,再将顶端数与n-1位置的数交换,如此反复执行,便能得到有序数组

  • 注意:
    • 升序用大根堆,降序就用小根堆(默认为升序)
    • 堆排序是不稳定的排序,空间复杂度为O(1),平均的时间复杂度为O(nlogn),最坏情况下也稳定在O(nlogn)

代码示例:

public class HeapSort {
	public static void main(String[] args) {
		int arr[] = { 555, -3, 7, 62, 54, 10, 86, 2, 5, -6, 9, 24 };
		System.out.println("排序前" + Arrays.toString(arr));
		heapSort(arr);
		System.out.println("排序后" + Arrays.toString(arr));
	}

	public static void heapSort(int array[]) {
		// 构建一个大顶堆,从array.length/2 - 1 最后一个非叶子结点开始
		for (int i = array.length / 2 - 1; i >= 0; i--) {
			adjustHeap(array, i, array.length);
		}
		for (int len = array.length - 1; len > 0; len--) {
			// 大顶堆的根元素与数组末尾元素交换
			int temp = array[0];
			array[0] = array[len];
			array[len] = temp;

			// 交换后的末尾元素忽略(len--) 不再参与堆结构的调整
			// 重新调整堆结构
			adjustHeap(array, 0, len);
		}
	}

	/**
	 * 完成将以i对应的非叶子结点的树调整成大顶堆
	 */
	public static void adjustHeap(int[] array, int i, int length) {
		// 先把当前元素取出来,因为当前元素可能要一直移动
		int temp = array[i];
		// 2*i+1表示结点i的左子树
		for (int k = 2 * i + 1; k < length; k = 2 * k + 1) {
			if (k + 1 < length && array[k] < array[k + 1]) {
				k++;// 让k先指向子节点中最大的节点
			}
			if (array[k] > temp) {// 如果发现结点(左右子结点)大于根结点,则进行值的交换
				array[i] = array[k];// 把较大的值赋值给父节点
				// array[k] = temp; // 这里没必要换
				i = k;// 子结点更换了,以子结点为根的子树会受到影响,指针移向子节点,循环对子结点所在的树继续进行判断
			} else {
				break;// 不用交换,直接终止循环
			}
		}
		array[i] = temp;// 将temp值放到最终的位置
	}

}

参考:

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:43:26  更:2022-09-13 11:46:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 11:44:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码