堆排序
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.性能分析
堆排序的時間複雜度爲.