堆排序
来源:互联网 发布:开票软件登录 编辑:程序博客网 时间:2024/04/30 18:30
//功能:模范算法导论,Heapify维持基本的堆排序的性质,Sort实现堆排序的的核心思想
//大致流程:
//1,调用input接受输入数据
//再调用BulidHeap来建立一个大根堆
//然后循环地把第一个数据后需要排序的最后一个数据(从iCount到2)
//交换之后,第一个位置的数据可能(还是一定)破坏了堆得性质,所谓堆得性质就是两个儿子要比自己小,否则就***
//进行维护,知道把这个数放到合适的位置上
//每一次都会取出最大的一个数,放到iCount所在位置,最后推出一个小结论,要对元素进行升序排序,那么就必须建立大根堆,降序那么就必须建立小根堆
//刚开始第一个Bug:判断左右子序列数是否比他大的时候,一直用array[i]进行比较
//the second:在找出最大的元素之后,没有对这两个元素进行交换,
//the third:在交换元素之后,应该先把iCount减1然后再调用Heapify(1),
//大致流程:
//1,调用input接受输入数据
//再调用BulidHeap来建立一个大根堆
//然后循环地把第一个数据后需要排序的最后一个数据(从iCount到2)
//交换之后,第一个位置的数据可能(还是一定)破坏了堆得性质,所谓堆得性质就是两个儿子要比自己小,否则就***
//进行维护,知道把这个数放到合适的位置上
//每一次都会取出最大的一个数,放到iCount所在位置,最后推出一个小结论,要对元素进行升序排序,那么就必须建立大根堆,降序那么就必须建立小根堆
//刚开始第一个Bug:判断左右子序列数是否比他大的时候,一直用array[i]进行比较
//the second:在找出最大的元素之后,没有对这两个元素进行交换,
//the third:在交换元素之后,应该先把iCount减1然后再调用Heapify(1),
#include <iostream>using namespace std;#define MAX_COUNT 10000class HeapSort{public: double array[MAX_COUNT]; HeapSort(); int Input(int count);//输入数据 void Heapify(int i); int num;//数组中元素的个数 void Print(); void BulidHeap(); void Sort(); int iCount;};HeapSort::HeapSort(){ memset(array,0,sizeof(array)); iCount = 0;}int HeapSort::Input(int count){ num = count; iCount = count; for(int i=1;i<=count;i++) { cin>>array[i];//输入数据 } return count;}void HeapSort::Heapify(int i){ int l =i*2; int r =i*2+1; int largest = i; if(l<=iCount&&array[l]>array[i]) largest = l; if(r<=iCount&&array[r]>array[largest])//注意这里是把右边的值和当前的最大值进行比较,而并非是array[i] largest = r; if(largest!=i) { double temp = array[i];//寻找最大数的目的是为了交换数据 array[i] = array[largest]; array[largest] = temp; this->Heapify(largest); }}void HeapSort::Print(){ for(int i=1;i<=num;i++) { cout<<array[i]<<" "; } cout<<endl;}void HeapSort::BulidHeap(){ for(int i=num/2;i>=1;i--) { this->Heapify(i); }}void HeapSort::Sort(){ for(int i=iCount;i>=2;i--) { double temp = array[i]; array[i] = array[1]; array[1] = temp; iCount--;//此处应该放在前面否则在调用Heapify的时候会把最后一个数和已经放好的数进行交换,就会进行两次交换 this->Heapify(1); //iCount--; this->Print(); }}int main(){ HeapSort heap; heap.Input(10);//输入十个数据 //heap.Heapify(1); heap.BulidHeap(); heap.Sort(); heap.Print(); return 0;}
本人测试的数据只有十几组,可能存在一些小bug,入过你发现有写测试数据不能通过,请通知我,共同进步!谢谢
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- arm下 线性地址到物理地址映射图示
- Lenovo A60 终极简单刷机解说 (菜鸟入门)
- Oracle注入utl_http存储攻击尝试
- Fedora 15 安装攻略
- 未来一年内计划做得事情
- 堆排序
- 犀利的 oracle 注入技术
- 约瑟夫环,删除后,剩下最后一个数字
- 关于const的使用
- Android 应用程序多Activity跳转之后退出整个程序
- VC释放EXE资源文件
- 三星SM431性能参数!
- 数学之美--贝塞尔曲线
- 理解MFC中的“资源”概念