堆排序与大根堆
最后的备注自己瞎加的,往前辈和大神不吝赐教,多多指出问题,提出意见或建议。
代码改自左神。
纯C代码,编辑器:Code::Blocks 16.01
这是我在CSDN的第①篇博客,继续努力吧。
#include <stdio.h>
#include <stdlib.h>
//形成大根堆的代价是log1+log2+log3+....+logn-1==>O(n)
void swap(int *arr,int a,int b){
int temp;
temp = *(arr+a);
*(arr+a) = *(arr+b);
*(arr+b) = temp;
}
//建立大根堆使用 while终止条件(-1)/2=0
void heapinsert(int arr[],int index){
while(arr[index]>arr[(index-1)/2]){
swap(arr,index,(index-1)/2);
index = (index-1)/2;
}
}
//heapify表示从0到heapsize-1已经形成了大根堆,在往后就越界,index为变化的值的位置
//堆中一个值变化后,重新调整的过程
void heapify(int arr[],int index,int heapsize){
int leftson = index * 2 + 1;
int largest;
while(leftson<heapsize){
largest=(leftson+1<heapsize)&&(arr[leftson+1]>arr[leftson])?(leftson+1):leftson;
largest = (arr[largest]>arr[index])?largest:index;
if(largest == index){
break;
}
swap(arr,largest,index); // largest != index
index = largest;
leftson = index * 2 + 1;
}
}
void heapsort(int arr[],int len){
int i;
int heapsize;
if(len<2)
return;
for(i=0;i<len;i++){
heapinsert(arr,i);
}
heapsize = len;
swap(arr,0,--heapsize);
while(heapsize>0){
heapify(arr,0,heapsize);
swap(arr,0,--heapsize);
}
}
int main()
{
int i;
int arr [] = {1,2,3,4,5,9,8,7,6,0};
heapsort(arr,10);
for(i=0;i<10;i++){
printf("%d ",arr[i]);
}
return 0;
}
/**
备注与想法:如果要向大根堆中插入一个值,请将这个值和根结点比较,
如果这个值大于根节点,将这个值放在根节点的位置,将原来根节点放
在末尾,如果调用heapinsert这个函数来进行调整。
如果这个值比根节点小,则直接放到末尾,调用heapinsert来调整。
*/