`

堆排序算法实现

 
阅读更多

1.堆排序. 平均复杂度,最坏复杂度都是nlogn

#include <iostream>
using namespace std;

//获得父结点,从0开始
#define get_Parent(i)    ( (i+1) >> 1 -1)     
//获得左孩子节点 
#define get_LeftChild(i) ( (i+1) << 1 -1)
//获得右孩子节点
#define get_RightChild(i) ( (i+1) <<1  )

int  DATALEN  = 10 ;//定义待排序的数据长度


//保持堆的性质
//A表示记录数据的数组,i表示坐标为i的结点
void keep_MaxHeap( int* A , int i )
{
	int l = get_LeftChild(i); //获得左右孩子
	int r = get_RightChild(i);
     
	//比较根节点与孩子节点的大小
    int largest = i; //保存最大值
	if ( l < DATALEN && A[l] > A[i] ) //左孩子
	{
        largest = l;  
	}
	else
		largest = i;
 
	if ( r < DATALEN && A[r] > A[largest] ) //右孩子
	{
        largest = r;  
	}

	if ( largest != i) //如果有改变,则会影响整个子树的结构,应该递归调整
	{
		//先互换
		int temp = A[i];
		A[i] = A[largest];
		A[largest] = temp;
	    keep_MaxHeap(A,largest);//调整以largest为根的子树
	}
   return ;
}

//建立最大堆
//以 DATALEN/2 到 根部不断跟新
void build_MaxHeap(int* A)
{

	for(int i = (DATALEN/2 - 1); i>=0 ; --i )
		keep_MaxHeap(A,i); //维护最大堆
	return ;
}

//堆排序
//方法就是,先建立一个最大堆
//然后将头结点元素与,最后一个一个节点互换
//直到倒数第二个
void heap_Sort(int* A)
{
	DATALEN = 10; //在这儿可以更新数组长度,默认为10
	
	//先建一个最大堆
	build_MaxHeap(A);

	//不断缩小数组大小,建立最大堆
	for ( int i=DATALEN-1; i>=1; --i )
	{
		//交换最大值与数组最后一个数字
		int temp = A[0];
		A[0] = A[DATALEN-1];
		A[DATALEN-1] = temp;
		
		DATALEN-- ; //数组大小又小了一个,因为已经又找到一个最大值放到了后面
		keep_MaxHeap(A,0);
	}

}
int main(void)
{
	int A[10] = {3,4,2,5,6,2,8,7,9,10};
	heap_Sort(A);
	cout<<A[0]<<endl;
	return 0;
}
分享到:
评论

相关推荐

    最小堆排序算法实现

    算法设计课程中的最小堆排序算法实现,windows下实现。

    堆排序算法 C语言实现

    C语言实现的堆排序算法。 提供了堆排序算法的一个接口,可以为其它功能提供功能。

    堆排序算法实现堆排序

    三、堆排序的算法实现 以下是一个简单的C++实现堆排序的例子: ```cpp #include using namespace std; void heapify(int arr[], int n, int i) { int largest = i; // 初始化最大值为根节点 int left = 2 * i ...

    hepafy方式的堆排序算法实现

    Building a heap using heapfying堆排序算法的实现即通过保持堆的特性,建堆,并实现对数组的排序操作。

    C++堆排序实现算法

    简单的堆排序算法:以定长数组为例,动态数组等可以以此类推

    堆排序算法(java)

    java的堆排序算法实现程序,含测试,可直接运行。java的堆排序算法实现程序,含测试,可直接运行。

    基于FPGA的堆排序算法实现与改进.pdf

    本文的研究重点在于FPGA上堆排序算法的实现与改进,对于FPGA硬件技术及硬件开发领域具有较高的参考价值。通过详细的设计方案和实验结果,为FPGA在复杂信号处理中的应用提供了新的思路和方法。这对于涉及数字信号调制...

    应用Java和Python分别实现堆排序算法

    堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和Python分别实现堆排序算法; 堆排序:应用Java和...

    堆排序算法实例

    在编程环境中,如VC6.0(Visual C++ 6.0),开发者可以编写代码来实现堆排序算法,并通过测试案例验证其正确性。这通常涉及到创建一个堆,调整元素,以及将最大元素(对于大顶堆)移出堆的过程。 描述中提到的...

    c语言实现堆排序算法

    ### c语言实现堆排序算法 堆排序是一种基于比较的排序算法,它利用了二叉堆的数据结构特性来高效地对数据进行排序。堆排序可以分为最大堆和最小堆两种,其中最大堆指的是父节点的值总是大于或等于任意一个子节点的...

    堆排序算法简单实现

    3. **完整过程**:堆排序算法通常包含两个阶段,构建堆和交换下沉。首先,通过从最后一个非叶子节点开始,自上而下地调整整个序列,使其成为一个合法的堆。然后,在这个过程中不断交换堆顶元素和末尾元素,每次交换...

    C++语言的算法实现包括插入排序冒泡排序堆排序快速排序

    本文将深入探讨四种在C++中实现的常见排序算法:插入排序、冒泡排序、堆排序和快速排序。这些算法各有特点,适用于不同的场景,理解并掌握它们对于提升编程能力至关重要。 1. **插入排序**: 插入排序是一种简单的...

    C++实现堆排序

    1、 实现堆排序算法。 2、 理论分析并实验验证堆排序算法的时间复杂度。

    C++实现希尔、快速、堆排序、归并排序算法

    本文将详细介绍C++中实现的希尔排序、快速排序、堆排序和归并排序这四种经典排序算法。 希尔排序,由Donald Shell于1959年提出,是一种改进的插入排序。它的基本思想是通过设置一个增量序列,将待排序的元素按照...

    7大排序算法实现程序(快速排序,冒泡排序,选择排序,归并排序,插入排序,希尔排序,堆排序)

    本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...

    堆排序算法源代码

    在这个名为"sort"的压缩包中,很可能包含了实现堆排序算法的C/C++源文件。 堆排序的核心思想是利用树形数据结构——堆(Heap)来完成排序。堆是一个近似完全二叉树的结构,同时满足大顶堆(父节点的值大于或等于其...

    排序算法编程 堆排序 快速排序

    本主题将深入探讨四种常见的排序算法:堆排序、快速排序以及两种未在标题中明确提到但同样重要的排序方法——基数排序和计数排序。 首先,让我们详细了解一下堆排序。堆排序是一种基于比较的排序算法,利用了数据...

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

    标题"排序算法之堆排序算法:用C++语言实现堆排序算法",意味着我们将讨论如何用C++编程语言来实现堆排序的过程。C++是面向对象的编程语言,具有丰富的库支持和高效的执行性能,是实现算法的理想选择。 描述"排序...

Global site tag (gtag.js) - Google Analytics