(三)堆排序

/******************************************* 堆排序,时间复杂度O(nlgn) 伪代码: 1.下标计算[为与程序对应,下标从0开始] Parent(i): return i/2 Left(i): return 2*i+1 Right(i): return 2*i+2 2.使下标i元素为根的的子树成为最大堆 MAX_HEAPIFY(A,i): l<——Left(i) r<——Right(i) if l<length(A) and A[l]>A[i] then largest<——l else largest<——i if r<length(A) and A[r]>A[largest] then largest<——r if largest != i then exchange A[i] <——> A[largest] MAX_HEAPIFY(A,largest) 3.最大堆的建立,将数组A编译成一个最大堆 BUILD_MAX_HEAP(A): heapsize[A]<——length[A] for i <—— length[A]/2+1 to 0 MAX_HEAPIFY(A,i) 4.堆排序 HEAP_SORT(A): BUILD_MAX_HEAP(A) for i<——length[A]-1 to 1 do exchange A[1] <——> A[i] length[A]<—— length[A]-1 MAX_HEAPIFY(A,0) ********************************************/ #include <stdio.h> #include <stdlib.h>
#define PARENT(i) (i)/2
#define LEFT(i) 2*(i)+1
#define RIGHT(i) 2*(i+1)
void max_heapify(int *arr,int index,int len) { int l=LEFT(index); int r=RIGHT(index); int largest; if(l<len && arr[l]>arr[index]) largest=l; else largest=index; if(r<len && arr[r]>arr[largest]) largest=r; if(largest != index){//将最大元素提升,并递归
        int tmp=arr[largest]; arr[largest]=arr[index]; arr[index]=tmp; max_heapify(arr,largest,len); } } void build_maxheap(int *arr,int len) { if(arr==NULL || len<=1) return; int i; for(i=len/2+1;i>=0;--i) max_heapify(arr,i,len); } void heap_sort(int *arr,int len) { if(arr==NULL || len<=1) return; int length=len; build_maxheap(arr,length); int i; int tmp; for(i=length-1;i>=1;--i){ tmp=arr[0]; arr[0]=arr[i]; arr[i]=tmp; max_heapify(arr,0,--length); } } //test 
int main() { int arr[10]={1,4,6,2,5,8,7,6,9,12}; heap_sort(arr,10); int i; for(i=0;i<10;++i) printf("%d ",arr[i]); }

 

你可能感兴趣的:(堆排序)