堆排序之Python和C++實現

堆排序

1.思想

堆排序(Heapsort)是指利用堆積樹(堆)這種數據結構所設計的一種排序算法,它是選擇排序的一種。可以利用數組的特點快速定位指定索引的元素。堆分爲大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大於其父節點的值,即A[PARENT[i]] >= A[i]。在數組的非降序排序中,需要使用的就是大根堆,因爲根據大根堆的要求可知,最大的值一定在堆頂。

2.Python3實現

#Heapsort
#python3
#Yanglin Tu

def max_heapify(heap,heap_size,i):
	l = 2*i + 1
	r = l + 1
	if l < heap_size and heap[l] > heap[i]:
		largest = l
	else:
		largest = i
	if r < heap_size and heap[r] > heap[largest]:
		largest = r 
	if largest != i:
		heap[i],heap[largest] = heap[largest],heap[i]
		max_heapify(heap,heap_size,largest)

def build_max_heap(heap):
	heap_size = len(heap)
	for i in range((heap_size-2)//2,-1,-1):
		max_heapify(heap,heap_size,i)

def heap_sort(heap):
	build_max_heap(heap)
	heap_size = len(heap)
	for i in range(heap_size-1,0,-1):
		heap[0],heap[i] = heap[i],heap[0]
		max_heapify(heap,i,0)
	return heap

def main():
	a = [20, 5, 7, 1, 66, 47, 5, 18]
	print(a)
	heap = heap_sort(a)
	print(heap)

if __name__ == '__main__':
	main()

3.C++實現

//headsort
//C++
//Yanglin Tu
#include <iostream>
using namespace std;
void swap(int &a, int &b){
	int temp = b;
	b = a;
	a = temp;
}

void max_heapify(int *heap,int heap_size,int i){
	int l, r, largest;
	l = 2*i + 1;
	r = l + 1;
	if(l < heap_size && heap[l] > heap[i])
		largest = l;
	else
		largest = i;
	if(r < heap_size && heap[r] > heap[largest])
		largest = r;
	if(largest != i){
		swap(heap[i],heap[largest]);
		max_heapify(heap,heap_size,largest);
	}
}

void build_max_heap(int *heap, int heap_size){
	for(int i=(heap_size-2)/2; i>=0; i--)
		max_heapify(heap,heap_size,i);
}

void heap_sort(int *heap,int heap_size){
	build_max_heap(heap,heap_size);
	for(int i =heap_size-1; i>0; i--){
		swap(heap[0],heap[i]);
		max_heapify(heap,i,0);
	}
}

int main(){
	int list_a[] = {20, 5, 7, 1, 66, 47, 5, 18};
	int length = sizeof(list_a)/sizeof(int);
	for(int i=0; i<length; i++)
		cout<<list_a[i]<<'\t';
	cout<<endl;
	heap_sort(list_a,length);
	for(int i=0; i<length; i++)
		cout<<list_a[i]<<'\t';
	cout<<endl;
	return 0;

}

4.性能分析

堆排序的時間複雜度爲\theta \left ( nlgn \right ).

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章