数据结构之排序——堆排序
2011-05-08 23:14
375 查看
view plaincopy to clipboardprint?
#include <stdlib.h>
#include <stdio.h>
#define MAX_SIZE 20
typedef int ElemType;
// 定义排序表
typedef struct HeapList
{
ElemType *keys;
int length;
}HeapList;
// 初始化排序表
void InitHeapList(HeapList &L)
{
L.keys = (ElemType*)malloc(MAX_SIZE * sizeof(ElemType));
L.length = 6;
int data[] = {38, 11, 9, 27, 96, 83};
for(int i = 0; i < 6; ++i)
L.keys[i + 1] = data[i];
}
// 打印排序表
void PrintHeapList(HeapList &L)
{
for(int i = 1; i <= L.length; ++i)
printf("%5d", L.keys[i]);
printf("/n");
}
//初始化大堆
void CreateBigHeap(HeapList &L)
{
int middle = L.length/2;
for(int i = middle; i > 0; i--)
{
if(((2*i + 1) > L.length) && (2*i <= L.length))
{
// 当没有右字树的时候只判断根节点和左字树的大小进行调换
if(L.keys[i] < L.keys[2*i])
{
L.keys[0] = L.keys[i];
L.keys[i] = L.keys[2*i];
L.keys[2*i] = L.keys[0];
}
}
if((2*i + 1) <= L.length)
{
// 左右子数都有
// 先比较左右字树哪个最大
int max = 2 * i;
if(L.keys[2*i] < L.keys[2*i + 1])max++;
if(L.keys[i] < L.keys[max])
{
L.keys[0] = L.keys[i];
L.keys[i] = L.keys[max];
L.keys[max] = L.keys[0];
}
}
}
}
// 初始化大堆之后,每一次的对前N-1个进行再次大堆
void heapfy(HeapList &L, int end)
{
//此时出去root节点,其余的还是都符合大堆的,可以从头结点和他的子节点对比较,一直比到没有没有孩子结点或者满足大堆的时候停止
for(int i = 1; 2*i <= end; i *=2)
{
if(2*i + 1 <= end)
{
// 还是三者对比,然后把i更新到替换到得为之
int max = 2*i;
if(L.keys[2*i] < L.keys[2*i + 1])max++;
// 右字树最大,那么把该字树根节点和他对换吧
L.keys[0] = L.keys[i];
L.keys[i] = L.keys[max];
L.keys[max] = L.keys[0];
// 切记,更新i的位置
i = max;
// 接下来跳出if,进入for的下一个循环,该此时继续把i的自树进行如上操作
}
if(2*i + 1 > end && 2*i <= end)
{
// 只有左子树啦
if(L.keys[i] < L.keys[2*i])
{
L.keys[0] = L.keys[i];
L.keys[i] = L.keys[2*i];
L.keys[2*i] = L.keys[0];
}
}
}
}
// 堆排序
void HeapSort(HeapList &L)
{
// 初始化一次大堆
CreateBigHeap(L);
// 把第一个和最后一个调换一下
L.keys[0] = L.keys[1];
L.keys[1] = L.keys[L.length];
L.keys[L.length] = L.keys[0];
for(int i = L.length - 1; i > 0; --i)
{
heapfy(L, i);
L.keys[0] = L.keys[1];
L.keys[1] = L.keys[i];
L.keys[i] = L.keys[0];
}
}
void main()
{
HeapList L;
InitHeapList(L);
PrintHeapList(L);
HeapSort(L);
PrintHeapList(L);
}
#include <stdlib.h>
#include <stdio.h>
#define MAX_SIZE 20
typedef int ElemType;
// 定义排序表
typedef struct HeapList
{
ElemType *keys;
int length;
}HeapList;
// 初始化排序表
void InitHeapList(HeapList &L)
{
L.keys = (ElemType*)malloc(MAX_SIZE * sizeof(ElemType));
L.length = 6;
int data[] = {38, 11, 9, 27, 96, 83};
for(int i = 0; i < 6; ++i)
L.keys[i + 1] = data[i];
}
// 打印排序表
void PrintHeapList(HeapList &L)
{
for(int i = 1; i <= L.length; ++i)
printf("%5d", L.keys[i]);
printf("/n");
}
//初始化大堆
void CreateBigHeap(HeapList &L)
{
int middle = L.length/2;
for(int i = middle; i > 0; i--)
{
if(((2*i + 1) > L.length) && (2*i <= L.length))
{
// 当没有右字树的时候只判断根节点和左字树的大小进行调换
if(L.keys[i] < L.keys[2*i])
{
L.keys[0] = L.keys[i];
L.keys[i] = L.keys[2*i];
L.keys[2*i] = L.keys[0];
}
}
if((2*i + 1) <= L.length)
{
// 左右子数都有
// 先比较左右字树哪个最大
int max = 2 * i;
if(L.keys[2*i] < L.keys[2*i + 1])max++;
if(L.keys[i] < L.keys[max])
{
L.keys[0] = L.keys[i];
L.keys[i] = L.keys[max];
L.keys[max] = L.keys[0];
}
}
}
}
// 初始化大堆之后,每一次的对前N-1个进行再次大堆
void heapfy(HeapList &L, int end)
{
//此时出去root节点,其余的还是都符合大堆的,可以从头结点和他的子节点对比较,一直比到没有没有孩子结点或者满足大堆的时候停止
for(int i = 1; 2*i <= end; i *=2)
{
if(2*i + 1 <= end)
{
// 还是三者对比,然后把i更新到替换到得为之
int max = 2*i;
if(L.keys[2*i] < L.keys[2*i + 1])max++;
// 右字树最大,那么把该字树根节点和他对换吧
L.keys[0] = L.keys[i];
L.keys[i] = L.keys[max];
L.keys[max] = L.keys[0];
// 切记,更新i的位置
i = max;
// 接下来跳出if,进入for的下一个循环,该此时继续把i的自树进行如上操作
}
if(2*i + 1 > end && 2*i <= end)
{
// 只有左子树啦
if(L.keys[i] < L.keys[2*i])
{
L.keys[0] = L.keys[i];
L.keys[i] = L.keys[2*i];
L.keys[2*i] = L.keys[0];
}
}
}
}
// 堆排序
void HeapSort(HeapList &L)
{
// 初始化一次大堆
CreateBigHeap(L);
// 把第一个和最后一个调换一下
L.keys[0] = L.keys[1];
L.keys[1] = L.keys[L.length];
L.keys[L.length] = L.keys[0];
for(int i = L.length - 1; i > 0; --i)
{
heapfy(L, i);
L.keys[0] = L.keys[1];
L.keys[1] = L.keys[i];
L.keys[i] = L.keys[0];
}
}
void main()
{
HeapList L;
InitHeapList(L);
PrintHeapList(L);
HeapSort(L);
PrintHeapList(L);
}
相关文章推荐
- SDUT 3401 数据结构实验之排序四:寻找大富翁(堆排序)
- 数据结构之排序(五)堆排序
- SDUT 3401 数据结构实验之排序四:寻找大富翁 堆排序
- 数据结构实验之排序四:寻找大富翁(堆排序)
- [C++]数据结构:排序算法Part1----冒泡排序、选择排序、插入排序、堆排序
- 【数据结构之排序7】堆排序
- 数据结构实验之排序四:寻找大富翁(堆排序)
- 【数据结构与算法】内部排序之三:堆排序(含完整源码)
- 【数据结构与算法】【排序】堆排序的代码实现
- [C++]数据结构:排序算法Part1----冒泡排序、选择排序、插入排序、堆排序
- 【数据结构与算法】内部排序之三:堆排序(含完整源码)
- 数据结构之排序:堆排序
- 【数据结构与算法】内部排序之三:堆排序(含完整源码)
- 数据结构经典排序---堆排序
- SDUT-3401 数据结构实验之排序四:寻找大富翁(堆排序)
- 数据结构实验之排序四:寻找大富翁(堆排序)
- 数据结构实验之排序四:寻找大富翁——堆排序
- 数据结构上机实验-希尔排序,快速排序,堆排序
- 排序-堆排序-数据结构(32)
- 数据结构6-排序算法(直接插入排序、希尔排序、快速排序、归并排序和堆排序)