堆排序。与归并排序一样,但不同与插入排序不同的是,堆排序的时间复杂度是O(nlog n)。而与插入排序相同,但不同于归并排序的是,堆排序同样具有空间原址性。
具体堆的实现原理,希望各位同学参考《算法导论》~个人仅是根据书中伪代码,编写C++代码不好地方。见谅
代码下载:点我
代码实现:
//heapsort.h
//堆排序
//Max_Heapify 过程:其时间复杂度为O(lg n), 它是维护最大堆性质的关键;
bool Max_Heapify(int* pArray, int i, int Heap_size)
{
int l = i*2+1;
int r = i*2+2;
int largest;
if ((l<=Heap_size-1)&&(pArray[l]>pArray[i]))
largest = l;
else
largest = i;
if ((r<=Heap_size-1)&&(pArray[r]>pArray[largest]))
largest = r;
if (largest != i)
{
int exchange = pArray[i];
pArray[i] = pArray[largest];
pArray[largest] = exchange;
Max_Heapify(pArray, largest, Heap_size);
}
return true;
}
//Build_Max_Heap: 具有线性时间复杂度,功能是从无序的输入数据组中构建一个最大堆;
bool Build_Max_Heap(int* pArray, int Length)
{
for (int i=(Length-1)/2; i>0; i--)
{
Max_Heapify(pArray, i, Length);
}
return true;
}
//Heap_Sort: 其时间复杂度薇O(nlgn),功能是对一个数组进行原址排序;
bool Heap_Sort(int* pArray, int Length)
{
int Heap_size = Length;
Build_Max_Heap(pArray, Length);
for (int i=Length-1; i>0; i--)
{
int exchange = pArray[0];
pArray[0] = pArray[i];
pArray[i] = exchange;
Heap_size = Heap_size-1;
Max_Heapify(pArray, 0, Heap_size);
}
return true;
}
//end 堆排序
//////////////////////////////////////////////////////////////////////////
//main.cpp
//
#include "sort.h"
#include "heapsort.h"
int main()
{
int A[14] = {27, 17, 3, 16, 13,
10, 1, 5, 7, 12,
4, 8, 9, 0};
int* p = &A[0];
//
//Insert_Sort_Ascending(p, 14); //插入排序
//Selection_Sort_Ascending(p, 14); //选择排序
//Bubble_Sort_Ascending(p, 0, 14); //冒泡排序
//Merge_Sort_Ascending(p, 0, 13); //归并排序
//Heap_Sort(p, 14); //堆排序
//
for (int i=0; i<14; i++)
{
cout<<A[i]<<",";
}
//
int a;
cin>>a;
return 0;
}