排序算法系列:堆排序(heapsort)(C語言)

通俗理解:運用數據結構中的最大堆結構,取出數組中的中的最大元素,在重新構造最大堆,再找出其最大元素,以此類推直到取完堆結構中的元素爲止,最終得到排好序的數組。觀看動態過程

void
swap(int* a,int *b)
{
	int swap;
	swap = *a;
	*a = *b;
	*b = swap;
}
//創建最大堆
void 
build_heap(int *a,int size)
{
	int k;
	for (k = size;k>=0;k--)
		heapfiy(a,size,k);
}

//保持最大堆性質
void
heapfiy(int *a,int size,int n)
{
	int left = 2*n+1;
	int right = 2*n+2;
	int max = n;
	if (left<=size && a[n] < a[left])
		max = left;
	if (right<=size && a[max] < a[right])
		max = right;
	if (max!=n)//此處檢查小分支上的元素是否發生變化,若變化繼續調用heapfiy()
	{
		swap(&a[max],&a[n]);
		heapfiy(a,size,max);
	}
	
}
//堆排序實現
void
heapsort(int*a,int size)
{
	build_heap(a,size);
	while (size>0)
	{
		swap(&a[0],&a[size--]);
		heapfiy(a,size,0);
	}
}

堆排序的平均時間複雜度O(n\mathrm{lg}n)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章