堆排序法c语言代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

堆排序法c语言代码
堆排序法是一种常用的排序算法,它的特点是时间复杂度为
O(nlogn),适用于大数据量的排序。

下面是使用C语言实现的堆排序算法。

1.原理
堆排序法的基本思想是将待排序的序列构成一棵完全二叉树,并满足
每个节点的值都大于/小于其子节点的值。

首先需要构建一个最大堆顶,将数组的首位和最后一个元素交换,然后将序列长度减一,再将已排
序的序列构建堆顶,交换首位元素,以此类推,直到序列长度为一。

最终得到的排序序列就是按照升序或降序排列的。

2.实现
#include <stdio.h>
#include <stdlib.h>
void head_adjust(int arr[], int start, int end);
void heap_sort(int arr[], int len);
int main()
{
int arr[] = {5, 9, 1, 4, 2, 8, 0, 3, 6, 7};
int len = sizeof(arr) / sizeof(arr[0]);
heap_sort(arr, len);
for(int i=0; i<len; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
/*建立大根堆*/
void head_adjust(int arr[], int start, int end)
{
int dad = start;
int son = dad*2 + 1;
while(son <= end)
{
if(son + 1 <= end && arr[son] < arr[son+1]) {
son++;
}
if(arr[dad] > arr[son])
{
return;
}
else
{
int temp = arr[dad];
arr[dad] = arr[son];
arr[son] = temp;
dad = son;
son = dad*2 + 1;
}
}
}
/*堆排序*/
void heap_sort(int arr[], int len) {
for(int i = len/2-1; i>=0; i--) {
head_adjust(arr, i, len-1); }
for(int i =len-1; i>0; i--)
{
int temp = arr[i];
arr[i] = arr[0];
arr[0] = temp;
head_adjust(arr, 0, i-1);
}
}
3.算法分析
时间复杂度:O(nlogn)
空间复杂度:O(1)
稳定性:不稳定排序方法(可能会交换值相同的元素的相对位置)
堆排序法适合数据量较大的排序任务,但在数据量较小时,实现的效率不如插入排序或快速排序。

相关文档
最新文档