`

堆排序简单示例

阅读更多
/**
 * 堆排序 维基百科
 * */
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#实现堆排序-代码示例

    堆排序是一种基于比较的排序算法...通过这个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; ...

    堆排序C++语言实现

    下面是一个简单的堆排序函数示例: ```cpp #include #include using namespace std; void heapify(int arr[], int n, int i) { int largest = i; // 初始化最大元素为根节点 int left = 2 * i + 1; int right...

    C++堆排序C++堆排序.zip

    下面是一个自定义堆排序的简单示例: ```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] &gt; arr...

    堆排序(R语言)

    以下是一个简单的R代码示例,演示如何手动实现堆排序: ```R heapify (arr, n, i) { largest left * i + 1 right * i + 2 if (left [left] &gt; arr[largest]) largest if (right [right] &gt; arr[largest])...

    java堆排序

    根据提供的信息,我们可以深入探讨Java中的堆排序以及几种常见的排序算法。这包括堆排序、快速排序、冒泡排序和选择排序等。 ### 堆排序 堆排序是一种基于比较的排序算法,它利用了二叉堆的数据结构。二叉堆可以是...

    堆排序的数组方式(C语言源程序)

    下面是一个简单的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] &gt; arr[largest]) ...

    堆排序之Java实现

    以下是一个简单的Java代码示例,演示如何手动实现堆排序: ```java public class HeapSort { public void sort(int[] arr) { int n = arr.length; // 建堆 for (int i = n / 2 - 1; i &gt;= 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#写的堆排序算法(heap sort)

    堆排序是一种基于比较的...总的来说,堆排序是一种简单且实用的排序算法,尤其适用于内存有限或需要稳定排序时间复杂度的场景。在C#中实现堆排序,可以加深对排序算法的理解,并为处理各种排序问题提供一个有效的工具。

    c++堆排序的实现原理和示例代码.rar

    下面将详细介绍堆排序的实现原理以及示例代码。 ### 堆排序的实现原理 堆排序的核心是构建一个大顶堆或小顶堆。堆是一个近似完全二叉树的结构,并且满足堆的性质:父节点的键值总是大于或等于(对于大顶堆)或小于...

    python下实现二叉堆以及堆排序的示例

    本文详细介绍了二叉堆的概念及其在Python中的实现方法,并且通过具体的代码示例展示了堆排序的过程。此外,还介绍了Python标准库中 `heapq` 模块的应用,这对于实际开发工作具有重要的参考价值。希望本文能够帮助...

    使用C语言实现堆排序.docx

    下面是一个使用 C 语言实现堆排序的简单示例,并带有注释以解释每个部分的作用。 在堆排序算法中,首先需要构建一个最大堆,然后逐步取出堆顶元素(最大值),并调整堆,最终得到有序数组。堆排序的时间复杂度为 O...

    排序方式 堆排序 选择 冒泡排序 归并排序 插入 选择

    本资源包含了几种常见的排序算法,包括堆排序、选择排序、冒泡排序、归并排序和插入排序。这些排序算法各有特点,适用于不同的场景,并且在理解它们的工作原理后,能够帮助初学者更好地掌握编程基础。 1. **堆排序*...

    排序算法之堆排序算法:用C++语言实现堆排序算法

    下面是一个简单的C++实现堆排序的代码示例: ```cpp #include using namespace std; void heapify(int arr[], int n, int i) { int largest = i; // 初始化最大元素为根 int left = 2 * i + 1; // 左子节点 ...

    解读堆排序算法及用C++实现基于最大堆的堆排序示例

    本文将详细解析堆排序算法,并通过C++实现基于最大堆的堆排序示例。 首先,理解堆排序的核心概念。堆是一个近似完全二叉树的数据结构,分为最大堆和最小堆。在最大堆中,每个节点的键值都不小于其子节点的键值,根...

    数据结构堆的插入与删除 堆排序

    以下是一个简单的堆排序示例: ```cpp #include #include void heapSort(std::vector&lt;int&gt;& arr) { int n = arr.size(); // 构建大顶堆 std::make_heap(arr.begin(), arr.end()); // 进行堆排序 for ...

    Java实现堆排序.rar

    本文件“Java实现堆排序.rar”可能包含了用Java语言编写的堆排序算法的源代码示例。下面我们将深入探讨堆排序的基本原理、步骤以及如何在Java中实现。 堆排序的核心是构建一个大顶堆或小顶堆。在大顶堆中,每个节点...

    堆排序

    以下是一个简单的HeapSort.java源码示例: ```java import java.util.ArrayList; import java.util.List; public class HeapSort { public static void sort(List&lt;Integer&gt; arr) { int n = arr.size(); // 建...

Global site tag (gtag.js) - Google Analytics