堆排序
首先,我们需要知道数据结构中堆的基本概念:堆排序分为大堆和小堆,大堆的父节点大于子节点(堆顶为最大值),同理小堆的父节点小于子节点(堆顶为最小值)。
其次,我们再来了解下内存中堆的概念:堆区内存的使用特点是不连续,在c/c++中是要手动进行动态分配和释放的。手动进行分配了一定要记得释放,不然就会造成内存泄漏时间一长,程序就崩了。(题外话,推荐一个检查内存泄漏的工具 VLD)
最后,回到重点,堆排序的时间复杂度为o(nlog(n))。另外,在求数组中k个最小值或者最大值时,其最少时间复杂度为o(nlog(k))。
堆排序代码如下:
void build_heap(int arr[], int start, int end)
{
int parent = start;
int son = 2*parent+1;
while(son<end)
{
if(son+1<end&&arr[son]<arr[son+1])
son++;
if(arr[parent]<arr[son])
{
swap(arr[parent],arr[son]);
parent = son;
son = 2*parent +1;
}
else break;
}
}
void sort_heap(int arr[],int len)
{
for(int i=len/2-1;i>=0;--i)
build_heap(arr,i,len);
for(int i=len-1;i>0;--i)
{
swap(arr[i],arr[0]);
build_heap(arr,0,i);
}
}
int main()
{
int arr[] = {1,10,3,2,9,4,8};
int len = (int)sizeof(arr)/sizeof(int);
sort_heap(arr,len);
return 0;
}