堆排序
堆排序:是指利用堆積樹(堆)這種數據結構所設計的一種排序算法,它是選擇排序的一種。可以利用數組的特點快速定位指定索引的元素。堆分爲大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大於其父節點的值。在數組的非降序排序中,需要使用的就是大根堆,因爲根據大根堆的要求可知,最大的值一定在堆頂。
是否穩定:不穩定
時間複雜度:O(N*lgN)
空間複雜度:O(1)
適用場景:
#include <stdio.h>
void Swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void AdjustHeap(int* array, int size, int parent)
{
int left = 2 * parent + 1;
int right = 2 * parent + 2;
int maxChild;
if (left >= size)//出口
return;
//滿足堆要求
//找最大孩子
if (right < size) //
{
if (array[left] < array[right])
{
maxChild = right;
}
else
{
maxChild = left;
}
}
else
{
maxChild = left; //右孩子不存在
}
if (array[parent] >= array[maxChild])
{
return;
}
Swap(&array[parent],&array[maxChild]);
AdjustHeap(array, size, maxChild);//遞歸
}
void AdjustHeap_while(int* array, int size, int parent)
{
int child = 2 * parent + 1;
while (child < size)//滿足堆條件
{
if (child + 1 < size&&array[child] < array[child + 1])//找最大元素
{
child += 1;//右孩子大
}
if (array[child]>array[parent])//判斷父節點是否大於孩子(大堆條件)
{
Swap(&array[child], &array[parent]);
parent = child;//向下調整
child = 2 * parent + 1;
}
else
return;
}
}
void HeapSort(int* array,int size)
{
//1.建堆
int root = ((size - 2)>>1);
for (; root >= 0; --root)
{
AdjustHeap(array,size,root);
//AdjustHeap_while(array, size, root);
}
//2.排序——堆刪除
int end = size - 1;
while (end > 0)//例:有10個元素,取掉9個大的,剩餘那個自然是最小的
{
Swap(&array[0], &array[end]);
AdjustHeap(array, end, 0);
//AdjustHeap_while(array, end, 0);
end--;
}
}
快速排序:https://blog.csdn.net/romantic_c/article/details/79902858
歸併排序:https://blog.csdn.net/romantic_c/article/details/79895622
冒泡排序:https://blog.csdn.net/romantic_c/article/details/78278861
計數排序:https://blog.csdn.net/romantic_c/article/details/79898442
選擇排序:https://blog.csdn.net/Romantic_C/article/details/81252784
插入排序:https://blog.csdn.net/Romantic_C/article/details/81259718
希爾排序:https://blog.csdn.net/Romantic_C/article/details/81260506