排序算法——堆排序:大根堆、小根堆

堆排序:

利用二叉树进行排序,有大根堆排序和小根堆排序

大根堆(升序):

java 复制代码
int[] arr = {3, 2, 5, 4, 7, 0, 8};//
按顺序可以构造出一棵二叉树
      3
   2     5
 4   7 0   8
我们可以得出以下规律:
i为父节点下标  则它的子节点下标应该为(如果存在的话)2*i+1和2*i+2
i为子节点时  则它的父节点下标应该为(i-1)/2
当待排序数的个数为n时,则第一个叶子节点的下标为n/2,最后一个非叶子节点下标为n/2 - 1 

**我们需要保证父节点一定比子节点大**
变为:
      3
   2     8
 4   7 0   5
变为:
      3
   7     8
 4   2 0   5
变为:
      8
   7     3
 4   2 0   5
.......

我们从最后一个非叶子节点遍历调整使得所有节点满足规则,当我们调整完所有非叶子节点后可以保证根节点一定是最大的,
这时我们将根节点与末尾节点交换,下一次只用对[0, arr.length()-1)再进行以上操作...显然我们可以发现这可以利用递归来轻松实现

代码实现:
/*
* 先将数组按顺序排列成一棵二叉树, 子节点找父节点-->(i-1)/2   父节点找子节点-->(i*2+1, i*2+2)
* 不断对这棵二叉树作大根堆的变换,根节点始终应该是最大值,做完变化后交换根节点与最后一个节点的值
* 下一次排除最后一个元素后对剩余元素再次进行变换(通过递归,减小边界值)
* */
private void sort(int[] nums, int bound) {//bound是待排序数组的长度
    if(bound == 0) return;
    for(int i = (bound / 2) - 1; i >= 0; i--) {
        int replace = 2 * i + 1;//需要与父节点交换的节点的下标先默认为左子节点因为右子节点可能不存在
        if((2 * i + 2) < bound && nums[replace] < nums[i * 2 + 2]) replace = 2 * i + 2;
        if(nums[i] < nums[replace]) swap(nums, i, replace);//父节点小再换
    }
    swap(nums, 0, bound - 1);//将根节点与最后一个叶子节点交换
    sort(nums, bound-1);
}

private static void swap(int[] nums, int index1, int index2) {
    int temp = nums[index1];
    nums[index1] = nums[index2];
    nums[index2] = temp;
}

小根堆(降序):

java 复制代码
private void sort(int[] nums, int bound) {//bound是待排序数组的长度
	if(bound == 1) return;
	for(int i = (bound >> 1) - 1; i >= 0; i--) {
		int replace = 2 * i + 1;//需要与父节点交换的节点的下标先默认为左子节点因为右子节点可能不存在
        if((2 * i + 2) < bound && nums[replace] > nums[i * 2 + 2]) replace = 2 * i + 2;
        if(nums[i] > nums[replace]) swap(nums, i, replace);//父节点大再换
	}
	swap(nums, 0, bound - 1);//将根节点与最后一个叶子节点交换
    sort(nums, bound-1);
}

private static void swap(int[] nums, int index1, int index2) {
    int temp = nums[index1];
    nums[index1] = nums[index2];
    nums[index2] = temp;
}
相关推荐
大雨淅淅2 分钟前
【机器人】ROS2 机械臂控制(MoveIt2)从入门到实战
人工智能·python·神经网络·学习·算法·机器学习·机器人
智者知已应修善业32 分钟前
【51单片机0.1秒计时到21.0时点亮LED】2024-1-5
c++·经验分享·笔记·算法·51单片机
apcipot_rain35 分钟前
计科八股20260606——二叉树、PCA、图深度学习、进程上下文、C语言预编译、文件读写、单精度浮点数
c语言·数据结构·算法·pca·图神经网络
scx_link38 分钟前
逻辑回归的总结
算法·机器学习·逻辑回归
沐籽李1 小时前
Proteina-Complexa:NVIDIA 如何把蛋白 Binder 设计推进到全原子生成时代?
大数据·人工智能·算法·英伟达·蛋白质生成
落羽的落羽1 小时前
【项目】JsonRpc框架——开发实现2(业务层)
linux·数据结构·c++·人工智能·算法·json·动态规划
h_a_o777oah1 小时前
2026 蓝桥杯软件 C++B组 国赛比赛经历及备赛建议
c++·经验分享·算法·蓝桥杯
SHARK_pssm1 小时前
【数据结构——单链表】
数据结构·经验分享·笔记
lightqjx1 小时前
【算法】数据结构_并查集
数据结构·算法·并查集
小雨下雨的雨1 小时前
鸿蒙PC Electron框架实现流体气泡模拟器
前端·人工智能·算法·华为·electron·鸿蒙