堆排序是指利用堆這種數(shù)據結構所設計的一種排序算法。堆是一個近似完全二叉樹的結構(通常堆是通過一維數(shù)組來實現(xiàn)的),并同時滿足堆的性質:即子結點的鍵值總是小于(或者大于)它的父節(jié)點。
我們可以很容易的定義堆排序的過程:
1.創(chuàng)建一個堆
2.把堆頂元素(最大值)和堆尾元素互換
3.把堆的尺寸縮小1,并調用heapify(A, 0)從新的堆頂元素開始進行堆調整
4.重復步驟2,直到堆的尺寸為1
分類--------------內部比較排序
數(shù)據結構----------數(shù)組
最差時間復雜度---- O(nlogn)
最優(yōu)時間復雜度---- O(nlogn)
平均時間復雜度---- O(nlogn)
所需輔助空間------ O(1)
穩(wěn)定性------------不穩(wěn)定
#include
usingnamespacestd;
intheapsize;//堆大小
voidexchange(intA[],inti,intj)//交換A[i]和A[j]
{
inttemp = A[i];
A[i] = A[j];
A[j] = temp;
}
voidheapify(intA[],inti)//堆調整函數(shù)(這里使用的是最大堆)
{
intleftchild =2* i +1;//左孩子索引
intrightchild =2* i +2;//右孩子索引
intlargest;//選出當前結點與左右孩子之中的最大值
if(leftchild A[i])
largest = leftchild;
else
largest = i;
if(rightchild A[largest])
largest = rightchild;
if(largest != i)
{
exchange(A, i, largest);//把當前結點和它的最大(直接)子節(jié)點進行交換
heapify(A, largest);//遞歸調用,繼續(xù)從當前結點向下進行堆調整
}
}
voidbuildheap(intA[],intn)//建堆函數(shù)
{
heapsize= n;
for(inti =heapsize/2-1; i >=0; i--)//對每一個非葉結點
heapify(A, i);//不斷的堆調整
}
voidheapsort(intA[],intn)
{
buildheap(A, n);
for(inti = n -1; i >=1; i--)
{
exchange(A,0, i);//將堆頂元素(當前最大值)與堆的最后一個元素互換(該操作很有可能把后面元素的穩(wěn)定性打亂,所以堆排序是不穩(wěn)定的排序算法)
heapsize--;//從堆中去掉最后一個元素
heapify(A,0);//從新的堆頂元素開始進行堆調整
}
}
intmain()
{
intA[] = {5,2,9,4,7,6,1,3,8};//從小到大堆排序
intn =sizeof(A) /sizeof(int);
heapsort(A, n);
printf("堆排序結果:");
for(inti =0; i < n; i++)
{
printf("%d ", A[i]);
}
printf("\n");
return0;
}