本系列将介绍两种排序方法,首先介绍一下堆排序。
堆是一种简单的数据结构,类似于完全二叉树,又可按其形式分为最大堆和最小堆(其实说白了就是一个数组,只不过把他的形状模拟为一棵树),堆排序是一种效率很高的排序算法,适用于小数据排序,具体讲解参考算法导论,下面把源码贴上,此代码调用了STL中的algorithm,它的作用是算法库,里面有替换的作用。
源码:
#include <iostream>
#include<algorithm>using namespace std;
//打印数组
void printa(int a[], int length)
{
for (int i = 0; i < length; ++i)
{
cout << a[i] << " ";
}
cout << endl;
}
// 调整堆
void maxHeap(int a[], int i, int length)
{
int lchild = 2 * i + 1;
int rchild = 2 * i + 2;
int max = i;
if (lchild < length && a[lchild] > a[max])
{
max = lchild;
}
if (rchild < length && a[rchild] > a[max])
{
max = rchild;
}
if (max != i)
{
swap(a[i], a[max]);//替换
maxHeap(a, max, length);
}
}
//建造堆
void buildHeap(int a[], int length)
{
for (int i = (length - 1) / 2; i >= 0; i--)
{
maxHeap(a, i, length);
}
}
//堆排序
void heapSort(int a[], int length)
{
buildHeap(a, length);
for (int i = length - 1; i >= 0; i--)
{
swap(a[i], a[0]);
maxHeap(a, 0, i);
}
}
int main()
{
int a[] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 100 };
int length = sizeof(a) / sizeof(int);
buildHeap(a, length);
printa(a, length);
heapSort(a, length);
printa(a, length);
cin.get();
}