堆排序(小根堆)
2017-02-20 19:56
246 查看
void push(int x) { h[++lenn]=x; int index=len; while(index>1 && h[index]<h[index/2]){ swap(h[index],h[index/2]); index=index/2; } }//在数组后面加多一个元素,进行调整时只需要往上调整,跟父节点比较就好(不用从最后一个有节点的节点开始遍历,进行向下调整)
void down_adjust(int n){ int num=n,k=n*2;//k为左儿子 int tmp=h ; while(k <= len){ if(k < len && h[k] > h[k+1]){ k++; }//如果右儿子存在,而且值比左儿子小,那么k++,待会父节点跟右儿子比较 if(h[k] >= tmp){ break; } else{ h[num]=h[k]; num=k; k=k*2; } } h[num]=tmp; } }//向下调整
void pop(int n) { if(len >= 1){ swap(h[1],h[len]); len--; down_ adjust(n); }//删除某个位置的结点,这时候只需要跟最后一个数交换,然后再向下调整就好
void create(int len) { for(int i=len/2; i >= 1; i--){ int num=i,k=i*2; int tmp=h[i]; while(k <= len){ if(k < len && h[k] > h[k+1]){ k++; } if(h[k] >= tmp){ break; } else{ h[num]=h[k]; num=k; k=k*2; } } h[num]=tmp; }//对于一个完全无序的数组进行调整,使得我们能进行堆排序,就是从最后一个有节点的节点往前遍历所有节点,然后依次对所有节点向下调整上面那个数组的下标是从1开始