排序算法-3-堆排序
一. 基本介绍
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树(左边可能大于右边)的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:
- 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
- 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;
堆排序的平均时间复杂度为 Ο(nlogn)。
二. 算法步骤
1. 先创建一个堆
2. 将堆头与堆尾调换
3. 将堆尺寸缩小,并重新调整
4. 重复步骤2,3。直到堆的尺寸呢为1
三. 图解

四. 源码
1 void swap(int *a, int *b) { 2 int temp = *a; 3 *a = *b; 4 *b = temp; 5 } 6 7 void max_heapify(int arr[], int start, int end) { 8 int dad = start; 9 int son = dad * 2 + 1; 10 while (son <= end) { 11 if (son + 1 <= end && arr[son]<arr[son+1]) { 12 son++; 13 } 14 if (arr[dad] > arr[son]) { //对于调整完毕的部分来说,dad总是大于son的,因此不必关心孙结点的情况,只要满足这个,就可以退出 15 return; 16 } 17 else { 18 swap(&arr[dad], &arr[son]); 19 dad = son; 20 son = son * 2 + 1; 21 } 22 } 23 } 24 25 void heapSort(int arr[], int len) { 26 int i; 27 // 初始化,i从最后一个父结点开始调整 28 for (i = len / 2 - 1; i >= 0; i--) 29 max_heapify(arr, i, len - 1); 30 // 先将第一个元素(因为它总是最大的)和已排好元素前一位做交换,再重新调整,直到排序完成 31 for (i = len - 1; i > 0; i--) { 32 swap(&arr[0], &arr[i]); 33 max_heapify(arr, 0, i - 1); 34 } 35 }



浙公网安备 33010602011771号