堆排序的数组实现
2012-05-30 11:10
176 查看
数组实现:
</pre><p><span style="font-size:14px"></span></p><pre name="code" class="cpp">#include "stdafx.h" #include<iostream> using namespace std; void adjustHeap(int a[],int index,int length) { int record = a[index]; for(int j = 2*index;j<length;j*=2)// { if(a[j]<a[j+1])//找到较大的儿子 { j = j+1; } if(record>a[j])//如果record比a[j]大,那表示不需要再往下找合适的地点放置record了 { break; } //如果record比当前的a[j]小,那么还需要继续往下层寻找record应该放置的地点 a[index] = a[j]; index = j; } a[index] = record; } void add(int *a,int size,int val)//往堆里插入一个元素,使其仍然保持有序 { //*(a+size) = 100; //display(a,size); int tmp = size;//tmp表示应该插入的位置 int parent = tmp/2; while(parent>0) { if(*(a+parent) > val)//如果父节点比val大,那么表示val不可能再往上升了。 break; *(a+tmp) = *(a+parent);//如果父节点比val小,说明val还应该往上升,才能调整成为大根堆 tmp = parent; parent = tmp/2; } *(a+tmp) = val; } void display(int a[], int len) { for(int i=1;i<len;i++) cout<<a[i]<<" "; cout<<endl; } int main() { int a[20] = {0,49,38,65,97,76,13,27,49}; int len = 9; display(a,len); for(int i=len/2;i>0;i--)//从最后一个非叶子节点开始调整 { adjustHeap(a,i,len); } add(a,len,100); len++; display(a,len); for(int i=0;i<len-1;i++)//交换树根和最后一个叶子节点,这样最大的数就到数组最后去了,然后在调整前面的未排序节点 { int tmp = a[1]; a[1] = a[len-1-i]; a[len-1-i] = tmp; adjustHeap(a,1,len-2-i); } display(a,len); getchar(); return 0; }
相关文章推荐
- 排序算法的数组实现 -- 堆排序(二)
- 数组实现堆排序(c++)
- 二叉树-----数组存储结构及操作算法的实现------堆排序
- 数组实现堆排序(来源算法导论)
- java实现堆排序(放入数组的索引对应二叉树节点位置)、归并排序
- 使用数组实现堆排序
- C++实现数组最大堆排序
- 详解数组实现隐式二叉堆及堆排序
- 利用数组实现的堆排序
- 堆排序,堆增删操作,Java数组实现堆排序
- php实现堆,将数组进行堆排序
- 数据结构系列之堆排序(基于数组实现)
- Javascript 数组自定义排序,并获取排序后的保存原索引的同序数组(堆排序实现)
- 堆排序实例(Java数组实现)
- 堆的定义、使用数组实现堆的创建、调整、删除和插入、堆排序
- 第九周 数据结构实现项目--数组和广义表【项目2.2 - 压缩存储的对称矩阵的运算】
- 使用sort()方法实现数组排序
- 全排列算法数组实现and全排列算法
- 创建一个数组,实现初始化、逆置和清空
- java数组实现去重且不改变原先顺序