作者
| zhonglihao
|
算法名
| 堆排序 Heap Sort
|
分类
| 排序
|
复杂度
| nlogn型
|
形式与数据结构
| C++代码 一维数组结构
|
特性
| 原址排序特性 计算机移位特性 代码较多
|
具体参考出处
| 《算法导论》
|
备注 |
|
// heap_sort.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>
typedef unsigned int uint32;
#define data_num 20 //排序数组大小
unsigned int parent(unsigned int i);
unsigned int left(unsigned int i);
unsigned int right(unsigned int i);
void max_heapify(unsigned int data[], unsigned int i, unsigned int heap_size);
void build_max_heap(unsigned int *data, unsigned int heap_size);
int _tmain(int argc, _TCHAR* argv[])
{
unsigned int i,j,k,m,temp;
unsigned int data_array[data_num+1];//不实用0索引为了方便移位
//创造随机数组
srand(83301576); //我老家电话号码 找到算你赢
//按照二叉树形式打印
for (i = 1,j = 1,k = 1; i < data_num+1; i++)
{
data_array[i] = rand();
printf(" %d\t", data_array[i]);
//金字塔打印
if (i == j)
{
k = k * 2;
j = j + k;
printf("\n");
}
}
printf("\n\n");
//构造一次最大堆
printf("建堆\n");
build_max_heap(data_array, data_num);
for (i = 1, j = 1, k = 1; i < data_num + 1; i++)
{
printf(" %d\t", data_array[i]);
if (i == j)
{
k = k * 2;
j = j + k;
printf("\n");
}
}
printf("\n\n");
//主要排序过程
m = data_num;
while (m >= 2)
{
//置换顶元素到尾部
temp = data_array[m];
data_array[m] = data_array[1];
data_array[1] = temp;
m--;
//再次构建最大堆
max_heapify(data_array, 1, m);
for (i = 1, j = 1, k = 1; i < data_num + 1; i++)
{
printf(" %d\t", data_array[i]);
if (i == j)
{
k = k * 2;
j = j + k;
printf("\n");
}
}
printf("\n\n");
}
//打印输出
for (i = 1, j = 1, k = 1; i < data_num + 1; i++)
{
printf(" %d\t", data_array[i]);
if (i == j)
{
k = k * 2;
j = j + k;
printf("\n");
}
}
printf("\n\n");
while (1);
return 0;
}
unsigned int parent(unsigned int i)
{
return (i >> 2);
}
unsigned int left(unsigned int i)
{
return (i << 1);
}
unsigned int right(unsigned int i)
{
return ((i << 1) + 1);
}
//按照最大堆原则整理二叉树,由上至下
void max_heapify(unsigned int *data, unsigned int i, unsigned int heap_size)
{
uint32 largest = i;
uint32 temp;
unsigned int le = left(i);//左儿子
unsigned int ri = right(i);//右儿子
if (le <= heap_size && data[le] > data[i])
largest = le;
else
largest = i;
if (ri <= heap_size && data[ri] > data[largest])
largest = ri;
if (largest != i)
{
temp = data[largest];
data[largest] = data[i];
data[i] = temp;
max_heapify(data, largest, heap_size);
}
}
//构建最大堆 只需要搜索一半数组长度即可
void build_max_heap(unsigned int *data, unsigned int heap_size)
{
unsigned int i;
unsigned int bound = (heap_size / 2);
for (i = bound; i >=1 ; i--)
{
max_heapify(data, i, heap_size);
}
}
/*
* 时间复杂度 nlogn 原址排序特性 计算机移位特性
* 代码较多
*/