C++ 堆排序

详细讲解请参照此博客内容:https://www.cnblogs.com/chengxiao/p/6129630.html

#include <iostream>
using namespace std;

void sort(int a[],int n);
void maxHeap(int a[],int i,int n);
void swap(int &a,int &b);

int main()
{
	int arry[]={4,6,8,5,9};
	sort(arry,5);
	for (int i=0;i<5;i++)
		cout<<arry[i]<<" ";//打印堆排序后的数组
	cout<<endl;
	system("pause");
	return 0;
}

void sort(int a[],int n)
{
	//构建大顶堆
	for (int i=n/2-1;i>=0;i--)//从最后一个非叶子结点开始从上往下,从右往左开始遍历
		maxHeap(a,i,n);
	//调整堆结构+交换堆顶元素与末尾元素
	for (int j=n-1;j>0;j--)
	{
		swap(a[0],a[j]);//交换第一个数与最后一个数,此时数组的最后一个数为最大数
		maxHeap(a,0,j);
	}
}
//调整最大堆(仅是调整过程,建立在大顶堆已构建的基础上
void maxHeap(int a[],int i,int n)
{
	int temp=a[i];
	for (int k=2*i+1;k<n;k=k*2+1)//从i的左子结点开始
	{
		if (k+1<n && a[k+1]>a[k])//如果左子结点小于右子结点,k指向右子结点
			k++;
		if (a[k]>temp)//如果子结点大于父结点,将子结点赋给父结点
		{
			a[i]=a[k];
			i=k;
		}
		else
			break;
	}
	a[i]=temp;
}

void swap(int &a,int &b)
{
	int temp;
	temp=a;
	a=b;
	b=temp;
}

 

### C++ 实现堆排序算法 以下是基于提供的参考资料以及专业知识编写的 C++ 堆排序实现代码: #### 代码实现 ```cpp #include <iostream> using namespace std; // 调整堆的函数,用于维护最大堆性质 void heapify(int arr[], int n, int i) { int largest = i; // 初始化最大值为根节点 int left = 2 * i + 1; // 左子节点索引 int right = 2 * i + 2; // 右子节点索引 // 如果左子节点大于当前最大值,则更新最大值 if (left < n && arr[left] > arr[largest]) largest = left; // 如果右子节点大于当前最大值,则更新最大值 if (right < n && arr[right] > arr[largest]) largest = right; // 如果最大值不是根节点,则交换它们的位置,并递归调整被影响的部分 if (largest != i) { swap(arr[i], arr[largest]); heapify(arr, n, largest); } } // 构建初始的最大堆 void buildMaxHeap(int arr[], int n) { for (int i = n / 2 - 1; i >= 0; --i) heapify(arr, n, i); // 自底向上逐层调用 heapify 函数 } // 主堆排序函数 void heapSort(int arr[], int n) { buildMaxHeap(arr, n); // 首先构建最大堆 // 不断取出堆顶元素放到最后位置,并重新调整剩余部分为新堆 for (int i = n - 1; i > 0; --i) { swap(arr[0], arr[i]); // 将堆顶元素移到数组末尾 heapify(arr, i, 0); // 对剩下的堆进行调整 } } // 打印数组 void printArray(int arr[], int size) { for (int i = 0; i < size; ++i) cout << arr[i] << " "; cout << endl; } // 测试程序 int main() { int arr[] = {12, 11, 13, 5, 6, 7}; int n = sizeof(arr) / sizeof(arr[0]); heapSort(arr, n); cout << "Sorted array is \n"; printArray(arr, n); } ``` --- #### 关键点解析 1. **`heapify` 函数** `heapify` 是核心函数之一,它负责维持最大堆的性质。如果某个节点违反了最大堆的要求(即父节点小于其子节点),则会通过交换来恢复堆的特性[^2]。 2. **`buildMaxHeap` 函数** 这个函数的作用是从下至上逐步建立一个完整的最大堆。对于每一个非叶子节点,都调用一次 `heapify` 来确保整个结构满足最大堆的定义[^4]。 3. **`heapSort` 函数** 排序过程分为两步:首先是构建最大堆;其次是不断将堆顶元素移至数组末端,并对剩余部分再次执行 `heapify` 操作以形成新的堆[^1]。 4. **时间复杂度分析** - 构造最大堆的时间复杂度为 \(O(n)\)[^3]。 - 每次调整堆的操作平均耗时 \(O(\log n)\),总共需重复 \(n\) 次,因此总时间复杂度为 \(O(n\log n)\)。 --- #### 输出示例 假设输入数组为 `{12, 11, 13, 5, 6, 7}`,运行上述代码后输出如下: ``` Sorted array is 5 6 7 11 12 13 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值