堆的建立,插入和自动排序
来源:互联网 发布:97天龙八部gotv源码 编辑:程序博客网 时间:2024/04/26 05:52
在网上看的代码基本上都是这样的:
#include<iostream>using namespace std;void MakeHeap (int a[], int n);intmain (){ int a[100]; int n, i; cout << "Enter the number:" << endl; cin >> n; for (i = 1; i <= n; i++) { cout << "Enter the element of the Heap:" << endl; cin >> a[i]; } MakeHeap (a, n); cout << "The Heap is:" << endl; for (i = 1; i <= n; i++) { cout << a[i] << " "; } cout << endl; return 1;}voidMakeHeap (int a[], int n){ int i, j, flag; for (i = n / 2; i >= 1; i--) { j = 2 * i; if (a[j] <= a[j + 1]) j++; if (a[i] < a[j]) { flag = a[i]; a[i] = a[j]; a[j] = flag; } }}
但是我总感觉不太对,所以就拿这个运行了一下,结果真的是错的,他这里只是实现了一步而已。也许是我没搞明白他的意思吧。
所以我自己实现了一个简单的,没考虑算法复杂度(特别是堆的建立,堆的排序还是挺简单的)。
基础:堆的建立过程复杂度为:O(n),而不是O(nlogn);这个是有证明的。
堆排序时间是由建立初始化堆和反复重建堆这两部分的时间开销构成
所以建立堆的过程不是这样的:
-----------------------------------------------------------------------------------------------------
1 个元素是一个堆
2 个元素时, 交换元素2与堆顶, 调整
3 个元素时, 交换元素3与堆顶, 调整
4 个元素时, 交换元素4与堆顶, 调整
一直到数组末尾, 于是整个数组就成为一个堆了。
-----------------------------------------------------------------------------------------------------
而是这样的:从n/2元素开始, 以该点为根,使之成为一个堆; 然后再以n/2-1元素开始, 使之成为一个堆;,, 一直到数组第1个元素,使之成为一个堆; 于是整个数组就成为一个堆了。
这里是很容易搞糊涂的地方。
#include<iostream>using namespace std;int data[100];int count;void printList(int data[],int length){int i;for(i=0;i<length;i++){cout<<data[i]<<" ";}cout<<endl;}void swap(int& first,int& second ){int temp=first;first=second;second=temp;}void HeapSortUp(int* data,int position){if(position<=0)return;if(data[position]>data[(position-1)/2]){swap(data[position],data[(position-1)/2]);HeapSortUp(data,(position-1)/2);}}void insert(int* data,int value){data[count++]=value;HeapSortUp(data,count-1);}void HeapSortDown(int a[],int position,int size){bool isChange=true;while(isChange){if(position>(size-2)/2)return;int j=2*position+1;if(a[j]<a[size-1])j=size-1;if(a[position]<a[j]){swap(a[position],a[j]);isChange=true;}elseisChange=false;position=j;}}void pop(int data[],int size){cout<<data[0]<<endl;swap(data[0],data[size-1]);--count;HeapSortDown(data,0,count);}void BuildBigHeap(int data[],int size){int i;for(i=(size-2)/2;i>=0;--i){HeapSortDown(data,i,size);}}void main(){cout<<"请输入count的值:";cin>>count;cout<<endl;int i;for(i=0;i<count;i++){cout<<"请输入第"<<i<<"个值: ";cin>>data[i];cout<<endl;}printList(data,count);BuildBigHeap(data,count);printList(data,count);insert(data,7);printList(data,count);pop(data,count段落标签);printList(data,count);return;}
- 堆的建立,插入和自动排序
- 堆的插入、删除和建立操作,堆排序
- 堆的插入、删除和建立操作,堆排序
- 最大堆的建立和堆排序
- 堆的建立、删除、插入操作以及堆排序
- 堆的建立&堆排序
- 堆建立和堆排序,快速排序
- 堆排序和建立最大堆
- 【作业存档】堆排序和插入排序的练习
- 堆的建立及排序
- 堆的建立与堆排序
- 堆的建立及堆排序
- 经典算法: 堆排序的原理和实现, 建立堆,调整堆
- 堆的插入 删除 排序
- Python算法 插入排序和堆排序
- 插入排序和堆排序算法
- 堆排序:插入方法建堆和普通方法建堆的比较
- Java排序算法--建立堆和堆排序(转)
- 测量Python代码运行的时间
- android 软键盘 输入法 弹出引起的各种不适终极解决方案
- jquery一款多样式好看图片轮换插件
- 采用MQTT协议实现android消息推送
- 数据结构(2)——队
- 堆的建立,插入和自动排序
- android防止内存溢出浅析(一)
- Tri_integral Summer Training 9 总结
- ios学习(四):通过CALayer为UIView添加显示样式
- Android编译系统分析大全
- Eclipse连接mysql,以及把随意一个日期变成星期几的例子
- 各种分布式文件系统简介
- 记录生活,学习点滴,加油!!!
- 【Android 开发教程】自定义ContentProvider的使用