堆排序
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.性能分析
堆排序的时间复杂度为.