堆排序的练习
2015-05-01 10:08
239 查看
//HeapSorter.h
#pragma once
#include <stdlib.h>
#include <stdio.h>
class HeapSorter
{
public:
HeapSorter(int nVecLength);
~HeapSorter(void);
protected:
HeapSorter()
{
m_pVect = NULL;
m_nVecLens = 0;
}
public:
void RandomValueVector();
void OutputVector();
void MinHeapSortToDescendArray(); //最小堆的降序排序
protected:
void MinHeapFixup(int *pArr, int i); //数组i元素更新到小堆的插入操作
//调整i节点的位置更新至正确的小堆:小堆的i节点下沉
void MinHeapFixdown(int *pArr, int i, int n);
void MakeMinHeap(int *pArr, int n); //从乱序数组建立最小堆
protected:
int *m_pVect;
int m_nVecLens;
};
//HeapSorter.cpp
#include "HeapSorter.h"
#include <time.h>
#include <assert.h>
HeapSorter::HeapSorter(int nVecLength)
{
m_nVecLens = nVecLength;
if(m_nVecLens > 0)
{
m_pVect = new int[m_nVecLens];
}
else
m_pVect = NULL;
srand(time(NULL));
}
HeapSorter::~HeapSorter(void)
{
if(m_pVect)
{
delete []m_pVect;
m_pVect = NULL;
}
}
void HeapSorter::RandomValueVector()
{
int *ptr=m_pVect;
for(int i=0; i < m_nVecLens; i++)
{
*ptr++ = rand();
}
}
void HeapSorter::MinHeapFixup(int *pArr, int i)
{
assert(pArr && i > 0);
int j, temp;
temp = pArr[i];
j = (i -1) / 2; //父节点
while(j >= 0 && i > 0)
{
if(pArr[j] <= temp)
break;
pArr[i] = pArr[j];
i = j;
j = (i -1) / 2; //父节点
}
pArr[i] = temp;
}
void HeapSorter::MinHeapFixdown(int *pArr, int i, int n)
{
assert(pArr && i >= 0 && n > 0);
int j, temp;
temp = pArr[i];
j = 2*i + 1; //第一个子节点
while(j < n)
{
if(j + 1 < n && pArr[j+1] < pArr[j])
j++;
if(pArr[j] >= temp)
break;
pArr[i] = pArr[j];
i = j;
j = 2*i + 1; //第一个子节点
}
pArr[i] = temp;
}
void HeapSorter::MakeMinHeap(int *pArr, int n)
{
assert(pArr && n > 0);
for(int i = n / 2 - 1; i >= 0; i--)
{
MinHeapFixdown(pArr, i, n);
}
}
void HeapSorter::MinHeapSortToDescendArray()
{
assert(m_pVect && m_nVecLens > 0);
MakeMinHeap(m_pVect, m_nVecLens);
int temp = 0;
for(int i = m_nVecLens - 1; i > 0; i--)
{
temp = m_pVect[i];
m_pVect[i] = m_pVect[0];
m_pVect[0] = temp;
MinHeapFixdown(m_pVect, 0, i);
}
}
void HeapSorter::OutputVector()
{
int lineNum = 20;
for(int i = 0; i < m_nVecLens; i++)
{
printf("%5d", m_pVect[i]);
if(i % lineNum == lineNum - 1)
{
printf("\n");
}
else
printf("\t");
}
printf("\n\n");
}
//main.cpp
#include <stdlib.h>
#include <stdio.h>
#include "HeapSorter.h"
int main()
{
HeapSorter sorter(100);
sorter.RandomValueVector();
sorter.OutputVector();
sorter.MinHeapSortToDescendArray();
sorter.OutputVector();
sorter.RandomValueVector();
sorter.OutputVector();
sorter.MinHeapSortToDescendArray();
sorter.OutputVector();
printf("press any key to exit:");
getchar();
}
#pragma once
#include <stdlib.h>
#include <stdio.h>
class HeapSorter
{
public:
HeapSorter(int nVecLength);
~HeapSorter(void);
protected:
HeapSorter()
{
m_pVect = NULL;
m_nVecLens = 0;
}
public:
void RandomValueVector();
void OutputVector();
void MinHeapSortToDescendArray(); //最小堆的降序排序
protected:
void MinHeapFixup(int *pArr, int i); //数组i元素更新到小堆的插入操作
//调整i节点的位置更新至正确的小堆:小堆的i节点下沉
void MinHeapFixdown(int *pArr, int i, int n);
void MakeMinHeap(int *pArr, int n); //从乱序数组建立最小堆
protected:
int *m_pVect;
int m_nVecLens;
};
//HeapSorter.cpp
#include "HeapSorter.h"
#include <time.h>
#include <assert.h>
HeapSorter::HeapSorter(int nVecLength)
{
m_nVecLens = nVecLength;
if(m_nVecLens > 0)
{
m_pVect = new int[m_nVecLens];
}
else
m_pVect = NULL;
srand(time(NULL));
}
HeapSorter::~HeapSorter(void)
{
if(m_pVect)
{
delete []m_pVect;
m_pVect = NULL;
}
}
void HeapSorter::RandomValueVector()
{
int *ptr=m_pVect;
for(int i=0; i < m_nVecLens; i++)
{
*ptr++ = rand();
}
}
void HeapSorter::MinHeapFixup(int *pArr, int i)
{
assert(pArr && i > 0);
int j, temp;
temp = pArr[i];
j = (i -1) / 2; //父节点
while(j >= 0 && i > 0)
{
if(pArr[j] <= temp)
break;
pArr[i] = pArr[j];
i = j;
j = (i -1) / 2; //父节点
}
pArr[i] = temp;
}
void HeapSorter::MinHeapFixdown(int *pArr, int i, int n)
{
assert(pArr && i >= 0 && n > 0);
int j, temp;
temp = pArr[i];
j = 2*i + 1; //第一个子节点
while(j < n)
{
if(j + 1 < n && pArr[j+1] < pArr[j])
j++;
if(pArr[j] >= temp)
break;
pArr[i] = pArr[j];
i = j;
j = 2*i + 1; //第一个子节点
}
pArr[i] = temp;
}
void HeapSorter::MakeMinHeap(int *pArr, int n)
{
assert(pArr && n > 0);
for(int i = n / 2 - 1; i >= 0; i--)
{
MinHeapFixdown(pArr, i, n);
}
}
void HeapSorter::MinHeapSortToDescendArray()
{
assert(m_pVect && m_nVecLens > 0);
MakeMinHeap(m_pVect, m_nVecLens);
int temp = 0;
for(int i = m_nVecLens - 1; i > 0; i--)
{
temp = m_pVect[i];
m_pVect[i] = m_pVect[0];
m_pVect[0] = temp;
MinHeapFixdown(m_pVect, 0, i);
}
}
void HeapSorter::OutputVector()
{
int lineNum = 20;
for(int i = 0; i < m_nVecLens; i++)
{
printf("%5d", m_pVect[i]);
if(i % lineNum == lineNum - 1)
{
printf("\n");
}
else
printf("\t");
}
printf("\n\n");
}
//main.cpp
#include <stdlib.h>
#include <stdio.h>
#include "HeapSorter.h"
int main()
{
HeapSorter sorter(100);
sorter.RandomValueVector();
sorter.OutputVector();
sorter.MinHeapSortToDescendArray();
sorter.OutputVector();
sorter.RandomValueVector();
sorter.OutputVector();
sorter.MinHeapSortToDescendArray();
sorter.OutputVector();
printf("press any key to exit:");
getchar();
}
相关文章推荐
- 堆排序练习(Heap Sort)
- 数据结构练习——堆排序
- php堆排序(heapsort)练习
- 【数据结构练习】排序——堆排序和快排
- 堆排序练习(证明)
- 【作业存档】堆排序和插入排序的练习
- 练习——堆排序
- 算法练习:堆排序
- C++编程练习(13)----“排序算法 之 堆排序“
- 排序(快速排序和堆排序)练习
- [算法练习]堆排序的C语言实现
- C++编程练习(13)----“排序算法 之 堆排序“
- Kotlin练习-堆排序
- 排序练习【sdut 1582】【堆排序】
- Hark的数据结构与算法练习之堆排序
- 《算法导论》第六章----堆排序练习(证明)(完整版)
- 编程练习:堆排序
- [每日练习]堆排序
- Scala练习-堆排序
- php堆排序(heapsort)练习