堆排序的关键在于顶堆的构建和调整,顶堆是一种特殊的完全二叉树;
大顶堆:根结点的值大于等于所有孩子结点;
小顶堆:根结点的值最小;
1、时间复杂度:o(nlogn)
2、算法思想:(以大顶堆为例)
(1)将给定的数组构建成一个大顶堆;
(2)将首尾元素交换,将堆顶元素放在数组的最后位置;
(3)长度减1,将剩下的元素构建堆;
(4)终止条件:堆的尺寸缩减为1时停止。
3、堆排序实现代码方法一:
/***************************************************************************
* @file main.c
* @author HAOJIEFENGLANG
* @date 5 August 2018
* @remark 5 August 2017
* @theme Heap sort
***************************************************************************/
#include<stdio.h>
#include<stdlib.h>
void swap(int a[], int i, int j);
void HeapAdjust(int a[], int s, int n);
//1、先建立堆
void HeapSort(int a[], int n)
{
//从下往上,从左往右构建大顶堆
int i = 0;
for (i = n / 2; i > 0; i--)
{
HeapAdjust(a,i,n);
}
//a[1]是堆顶元素;