数据结构——堆排序

简介: 数据结构——堆排序

一、排序思想


1.算法介绍


堆排序是指利用堆这种数据结构所设计的一种排序算法,堆排序也是选择排序的一种,只不过是通过堆来进行选择。


2.算法实现


2.1建堆


首先将给定的序列在逻辑上看作是一棵完全二叉树,然后根据完全二叉树的特点,从完全二叉树倒数第一个非叶子结点开始利用向下调整算法依次往前调整,这样就可以将完全二叉树调整为一个堆。


2.2堆排序


利用堆删除的思想来进行堆排序,将堆顶与末尾位置进行交换,然后对堆重新调整使之重新成为一个堆,每交换一次堆顶,末尾位置标记向前移动1,直到调整完整个序列,完成堆排序。


image.png


注:排升序需建大堆,排降序需建小堆。


详细实现可参考往期博客——堆


二、代码实现


1.完整代码


#include<stdio.h>
#include<stdlib.h>
//堆排序---->利用堆删除的思想来进行排序      升序:大堆   降序:小堆
void Test_HeapSort();
void HeapSort(int* array, int n);//堆排序
void AdjustDown(int* array, int parent, int size);//堆排序子函数->向下调整法
int Min(int num1, int num2);//降序--小堆
int Max(int num1, int num2);//升序--大堆
void Swap(int* parent, int* child);//交换双亲结点与孩子结点
void Printf_array(int* array, int length);//数组打印函数
int main() {
  Test_HeapSort();
  return 0;
}
void Test_HeapSort() {
  int array[] = { 49, 27, 37, 65, 28, 34, 25, 15, 18, 19 };
  int length = sizeof(array) / sizeof(array[0]);
  printf("排序前:");
  Printf_array(array, length);
  HeapSort(array, length);// 对数组进行堆排序
  printf("\n排序后:");
  Printf_array(array, length);
}
void HeapSort(int* array, int n) {//堆排序
  //1.建堆
  for (int root = ((n - 1) - 1) / 2; root >= 0; root--) {//n-1为最后一个叶子结点的下标,root为该结点的双亲
  AdjustDown(array, root, n);//向下调整
  }
  //2.利用堆删除的思想来进行排序
  int end = n - 1;//标记调整位置的最大下标
  while (end) {
  int temp = array[0];
  array[0] = array[end];
  array[end] = temp;
  AdjustDown(array, 0, end);
  end--;
  }
}
void AdjustDown(int* array, int parent, int size) {//向下调整
  int child = parent * 2 + 1;//标记左孩子
  while (child < size) {
  if (child + 1 < size && Max(array[child + 1], array[child])) {//找左右孩子较小的孩子
    child += 1;
  }
  if (Max(array[child], array[parent])) {//检测是否满足堆的特性
    Swap(&array[parent], &array[child]);//不满足,交换并继续向下调整
    parent = child;
    child = parent * 2 + 1;
  }
  else {//满足,直接返回
    return;
  }
  }
}
void Swap(int* parent, int* child) {//整数交换
  int temp = *parent;
  *parent = *child;
  *child = temp;
}
void Printf_array(int* array, int length) {//数组打印函数
  for (int i = 0; i < length; i++) {
  printf("%d ", array[i]);
  }
}
int Min(int num1, int num2) {//降序--小堆
  return num1 < num2;
}
int Max(int num1, int num2) {//升序--大堆
  return num1 > num2;
}


2.测试结果


1.png


三、性能分析


1.时间复杂度:1.gif


2.空间复杂度:2.gif


3.稳定性:不稳定


相关文章
|
5月前
|
算法 Python
数据结构算法--4堆排序
堆排序过程概述:建立大根堆,将堆顶最大元素移出并替换为末尾元素,调整保持堆性质,重复此过程直至堆为空,实现排序。时间复杂度为O(nlogn)。Python中可用heapq模块进行堆操作。
|
6月前
|
机器学习/深度学习 人工智能 算法
数据结构与算法:堆排序和TOP-K问题
朋友们大家好,本节内容来到堆的应用:堆排序和topk问题
数据结构与算法:堆排序和TOP-K问题
|
6月前
|
算法
数据结构——堆的应用 堆排序详解
数据结构——堆的应用 堆排序详解
数据结构——堆的应用 堆排序详解
|
1月前
|
算法 搜索推荐
数据结构与算法学习十八:堆排序
这篇文章介绍了堆排序是一种通过构建堆数据结构来实现的高效排序算法,具有平均和最坏时间复杂度为O(nlogn)的特点。
73 0
数据结构与算法学习十八:堆排序
|
4月前
|
存储 算法
【数据结构】堆,堆的实现,堆排序,TOP-K问题
数据结构——堆,堆的实现,堆排序,TOP-K问题
49 1
【数据结构】堆,堆的实现,堆排序,TOP-K问题
|
3月前
|
搜索推荐 算法
【初阶数据结构篇】插入、希尔、选择、堆排序介绍(上篇)
堆排序(Heapsort)是指利⽤堆积树(堆)这种数据结构所设计的⼀种排序算法,它是选择排序的⼀ 种。它是通过堆来进⾏选择数据。需要注意的是排升序要建⼤堆,排降序建⼩堆。
19 0
|
3月前
|
算法
【初阶数据结构篇】堆的应用(堆排序与Top-K问题)
即求数据结合中前K个最⼤的元素或者最⼩的元素,⼀般情况下数据量都⽐较⼤。
45 0
|
4月前
|
搜索推荐
【数据结构常见七大排序(二)】—选择排序篇【直接选择排序】And【堆排序】
【数据结构常见七大排序(二)】—选择排序篇【直接选择排序】And【堆排序】
|
6月前
|
算法
[数据结构]——二叉树——堆排序
[数据结构]——二叉树——堆排序
|
6月前
|
存储 搜索推荐 算法
[数据结构]————排序总结——插入排序(直接排序和希尔排序)—选择排序(选择排序和堆排序)-交换排序(冒泡排序和快速排序)—归并排序(归并排序)
[数据结构]————排序总结——插入排序(直接排序和希尔排序)—选择排序(选择排序和堆排序)-交换排序(冒泡排序和快速排序)—归并排序(归并排序)