/**
* 堆排序 维基百科
* */
public class HeapSorts {
private static int[] sort = {144,233,55,66,1235,85,4,79};
/**
* @param args
*/
public static void main(String[] args) {
buildMaxHeap(sort);
heapSort(sort);
for(int i : sort){
System.out.println(i);
}
}
private static void heapSort(int[] data){
for(int i = data.length -1; i >0 ;i--){
//交换 将堆顶的值和最后一个元素交换
int temp = data[i];
data[i] = data[0];
data[0] = temp;
//交换完 从 堆顶就开始不稳定了 因此要从第一个元素开始重新建
maxHeap(data,i,0);
}
}
private static void buildMaxHeap(int[] data){
int startIndex = getParaentIndex(data.length -1);
//建堆
for(int i = startIndex ;i >=0 ;i--){
maxHeap(data,data.length,i);
}
}
/**
* @param index 建堆的位置
* @param heapSize
* */
private static void maxHeap(int[]data ,int heapSize ,int index){
int left = getLeftChildIndex(index);
int right = getRightChildIndex(index);
int largest = index ;//用来记录根 左右孩子的最大值
//创建的是大根堆
if(left < heapSize && data[index] < data[left]){
largest = left;
}
if(right < heapSize && data[largest] < data[right]){
largest = right;
}
//如果最大值不是根节点 需要交换
if(largest != index){
int temp = data[index];
data[index] = data[largest];
data[largest] = temp ;
//交换后可能破坏子堆的稳定性 因此要重新建堆 largest 记录了交换的位置
maxHeap(data,heapSize,largest);
}
}
//获取父节点
private static int getParaentIndex(int current){
return (current - 1) >> 1 ;
}
//获取左孩子节点
private static int getLeftChildIndex(int current){
return (current << 1) + 1;
}
//获取右孩子节点
private static int getRightChildIndex(int current){
return (current << 1) + 2;
}
}
分享到:
相关推荐
4. **代码参考**:提供的压缩文件“堆排序简单示例”应该包含了堆排序的代码示例,你可以通过阅读和运行这些代码来加深对堆排序的理解。记得在分析代码时关注关键函数,如`heapify`(用于调整堆)和`heap_sort`...
堆排序是一种基于比较的排序算法...通过这个C#代码示例,我们可以清晰地理解堆排序的工作原理和实现细节。堆排序的时间复杂度为O(n log n),空间复杂度为O(1),是一种效率较高的排序算法,尤其适用于大规模数据的排序。
下面是一个简单的C++代码示例: ```cpp #include using namespace std; void heapify(int arr[], int n, int i) { int largest = i; // 初始化最大值为根节点 int left = 2 * i + 1; int right = 2 * i + 2; ...
下面是一个简单的堆排序函数示例: ```cpp #include #include using namespace std; void heapify(int arr[], int n, int i) { int largest = i; // 初始化最大元素为根节点 int left = 2 * i + 1; int right...
下面是一个自定义堆排序的简单示例: ```cpp void heapify(int arr[], int n, int i) { int largest = i; // 初始化最大值为根节点 int left = 2 * i + 1; int right = 2 * i + 2; if (left [left] > arr...
以下是一个简单的R代码示例,演示如何手动实现堆排序: ```R heapify (arr, n, i) { largest left * i + 1 right * i + 2 if (left [left] > arr[largest]) largest if (right [right] > arr[largest])...
根据提供的信息,我们可以深入探讨Java中的堆排序以及几种常见的排序算法。这包括堆排序、快速排序、冒泡排序和选择排序等。 ### 堆排序 堆排序是一种基于比较的排序算法,它利用了二叉堆的数据结构。二叉堆可以是...
下面是一个简单的C语言实现堆排序的示例: ```c #include void heapify(int arr[], int n, int i) { int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left [left] > arr[largest]) ...
以下是一个简单的Java代码示例,演示如何手动实现堆排序: ```java public class HeapSort { public void sort(int[] arr) { int n = arr.length; // 建堆 for (int i = n / 2 - 1; i >= 0; i--) heapify(arr...
以下是一个简单的C++堆排序示例: ```cpp #include using namespace std; void heapify(int arr[], int n, int i) { int largest = i; // 初始化最大元素为根 int left = 2 * i + 1; int right = 2 * i + 2; ...
堆排序是一种基于比较的...总的来说,堆排序是一种简单且实用的排序算法,尤其适用于内存有限或需要稳定排序时间复杂度的场景。在C#中实现堆排序,可以加深对排序算法的理解,并为处理各种排序问题提供一个有效的工具。
下面将详细介绍堆排序的实现原理以及示例代码。 ### 堆排序的实现原理 堆排序的核心是构建一个大顶堆或小顶堆。堆是一个近似完全二叉树的结构,并且满足堆的性质:父节点的键值总是大于或等于(对于大顶堆)或小于...
本文详细介绍了二叉堆的概念及其在Python中的实现方法,并且通过具体的代码示例展示了堆排序的过程。此外,还介绍了Python标准库中 `heapq` 模块的应用,这对于实际开发工作具有重要的参考价值。希望本文能够帮助...
下面是一个使用 C 语言实现堆排序的简单示例,并带有注释以解释每个部分的作用。 在堆排序算法中,首先需要构建一个最大堆,然后逐步取出堆顶元素(最大值),并调整堆,最终得到有序数组。堆排序的时间复杂度为 O...
本资源包含了几种常见的排序算法,包括堆排序、选择排序、冒泡排序、归并排序和插入排序。这些排序算法各有特点,适用于不同的场景,并且在理解它们的工作原理后,能够帮助初学者更好地掌握编程基础。 1. **堆排序*...
下面是一个简单的C++实现堆排序的代码示例: ```cpp #include using namespace std; void heapify(int arr[], int n, int i) { int largest = i; // 初始化最大元素为根 int left = 2 * i + 1; // 左子节点 ...
本文将详细解析堆排序算法,并通过C++实现基于最大堆的堆排序示例。 首先,理解堆排序的核心概念。堆是一个近似完全二叉树的数据结构,分为最大堆和最小堆。在最大堆中,每个节点的键值都不小于其子节点的键值,根...
以下是一个简单的堆排序示例: ```cpp #include #include void heapSort(std::vector<int>& arr) { int n = arr.size(); // 构建大顶堆 std::make_heap(arr.begin(), arr.end()); // 进行堆排序 for ...
本文件“Java实现堆排序.rar”可能包含了用Java语言编写的堆排序算法的源代码示例。下面我们将深入探讨堆排序的基本原理、步骤以及如何在Java中实现。 堆排序的核心是构建一个大顶堆或小顶堆。在大顶堆中,每个节点...
以下是一个简单的HeapSort.java源码示例: ```java import java.util.ArrayList; import java.util.List; public class HeapSort { public static void sort(List<Integer> arr) { int n = arr.size(); // 建...