堆的操作和堆排序-最小堆实现递减排序-C++
2014-09-04 10:10
274 查看
#include<iostream> #include<algorithm> #include<string> using namespace std; //参考:http://blog.csdn.net/morewindows/article/details/6709644 //http://www.cnblogs.com/dolphin0520/archive/2011/10/06/2199741.html void heapFixdown(int a[],int i,int n) //从第i个位置开始调整堆,从上向下 { int j=(2*i)+1;//子节点 int temp=a[i]; while (j<n) { if (j+1<n && a[j+1]<a[j]) //在左右孩子中找到最小的 { j++; } if (a[j]>=temp) break; a[i]=a[j]; i=j; //向下移动 j=2*i+1; } a[i]=temp; } void heapDeleteNumber(int a[],int n)//在最小堆中删除数,从头节点删除 { a[0]=a[n-1]; heapFixdown(a,0,n-1); } void heapFixup(int a[],int i) //最小堆调整,从下向上 { int j=(i-1)/2; int temp=a[i]; while (j>=0 && i!=0) { if (a[j]<=temp) { break;//找到a[i]的位置时停止 } a[i]=a[j]; i=j;//向上查找 j=(i-1)/2; } a[i]=temp; } void heapAddNumber(int a[],int n,int num)//最小堆中加入数据 { a =num; heapFixup(a,n); } void makeHeap(int a[],int n)//建立最小堆 { for (int i=n/2-1;i>=0;i--) { heapFixdown(a,i,n); } } void heapSort(int *a,int n)//注意使用最小堆排序后是递减数组,要得到递增数组,可以使用最大堆。 { makeHeap(a,n); for (int i=n-1;i>=1;i--) { swap(a[0],a[i]); heapFixdown(a,0,i-1); } } int main() { int a[]={9,12,17,30,50,20,60,65,4,49}; heapSort(a,10); for(int i=0;i<10;i++) cout<<a[i]<<' '; cout<<endl; return 0; }
相关文章推荐
- C++实现堆、最大堆、最小堆 -- 堆排序插入删除操作
- C++链表的创建、插入、删除、查找、合并、排序、修改等操作的实现
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——C++实现
- 排序算法的C++实现与性能分析(插入排序、归并排序、快速排序、STOOGE排序、堆排序)
- C++实现几种常用的时间复杂度为O(nlogn)的排序方法:归并排序、快速排序、堆排序、希尔排序
- C++实现直接插入排序,折半插入排序,希尔排序,冒泡排序,简单选择排序,快速排序,堆排序
- 插入排序、冒泡排序、选择排序、希尔排序、高速排序、归并排序、堆排序和LST基数排序——C++实现
- C++实现数组的排序/插入重新排序/以及逆置操作
- 算法导论-第六章-堆排序:基于最大堆的排序C++实现
- c++实现数据结构中的各种排序方法:直接插入、选择,归并、冒泡、快速、堆排序、shell排序
- 【算法】排序 (一):插入排序&希尔排序&选择排序&堆排序(C++实现)
- 堆排序,堆增删操作,Java数组实现堆排序
- 常用排序算法C++实现(堆排序,快速排序,归并排序,基数排序)
- 几种排序算法的C++实现——快速排序、堆排序、基数排序
- C++实现数组的排序/插入重新排序/以及逆置操作
- c++中复数的递增与递减操作实现
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序的C++代码实现
- C++ 用qsort()实现字符串数组元素排序
- C++对注册表常见操作的封装实现
- List<T>采用delegate快速实现排序、查找等操作