八大内部排序 -- 堆排序
2016-08-31 18:15
218 查看
堆排序(heap-sort):把关键字序列看成一颗二叉树,树上的非叶子节点的值均小于(或者大于)其左右子节点的值,所以树根肯定是这个序列的最小值或者最大值。堆排序的核心是树节点的调整,以维护一个最小堆树(或者最大堆),建堆树也是通过堆调整建立的。
时间复杂度为:O(nlong) ,不稳定的排序
代码如下:
#include <iostream>
using namespace std;
void print(int *a,int n){
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
void heap_ajust(int *a,int s,int len){
int key_value = a[s];
for(int j = 2*s;j<=len;j*=2){
if(j<len && a[j+1]>a[j])
j++;
if(key_value > a[j])
break;
a[s] = a[j];
s=j;
}
a[s] = key_value;
}
void heap_sort(int *a,int n){
// build heap
for(int i=n/2;i>=1;i--){
heap_ajust(a,i,n);
}
// sort
for(int i=n;i>0;i--){
swap(a[i],a[1]);
heap_ajust(a,1,i-1);
}
}
int main()
{
int *a;
int n;
cin>>n;
a= new int[n+1];
for(int i=1;i<=n;i++){
cin>>a[i];
}
heap_sort(a,n);
print(a,n);
return 0;
}
时间复杂度为:O(nlong) ,不稳定的排序
代码如下:
#include <iostream>
using namespace std;
void print(int *a,int n){
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
void heap_ajust(int *a,int s,int len){
int key_value = a[s];
for(int j = 2*s;j<=len;j*=2){
if(j<len && a[j+1]>a[j])
j++;
if(key_value > a[j])
break;
a[s] = a[j];
s=j;
}
a[s] = key_value;
}
void heap_sort(int *a,int n){
// build heap
for(int i=n/2;i>=1;i--){
heap_ajust(a,i,n);
}
// sort
for(int i=n;i>0;i--){
swap(a[i],a[1]);
heap_ajust(a,1,i-1);
}
}
int main()
{
int *a;
int n;
cin>>n;
a= new int[n+1];
for(int i=1;i<=n;i++){
cin>>a[i];
}
heap_sort(a,n);
print(a,n);
return 0;
}
相关文章推荐
- 2015年大二上-数据结构-内部排序-(6)-堆排序
- 数据结构_内部排序_希尔排序_快速排序_堆排序_归并排序_地址排序
- Java 八大排序之——堆排序
- (C语言)八大排序之:堆排序、快速排序
- 数据结构和算法设计专题之---八大内部排序
- 【算法之常用排序算法(一)】八大常用内部排序算法(快排、冒泡、希尔、堆排序等)
- 八大排序之堆排序
- 排序专题(四) / 不稳定的内部排序 / 堆排序
- C++代码,数据结构-内部排序-选择排序-堆排序
- 六、内部排序综合(九种)—插入类排序(直接插入、折半插入、希尔排序);交换类排序(冒泡、快速);选择类排序(简单选择、堆排序);二路归并排序;基数排序
- Java提高 - 八大排序方法之堆排序
- 八大排序之堆排序
- 八大内部排序--希尔排序
- 八大排序--堆排序
- 数据结构与算法系列之一:八大排序之堆排序
- 八大内部排序--快速排序
- 内部排序--堆排序
- 八大排序之堆排序
- 【排序】用Python实现八大排序算法--堆排序
- java五种内部排序(直接插入排序、希尔排序、快速排序、堆排序、归并排序)