题目描述:
把具有n个数据元素的数组用堆排序进行排序,并输出排完序后的结果。
输入:
首先输入n表示数组的大小,接着下面一行输入数组的的值,n<1000。
输入样例:
6
1 5 9 3 2 4
输出样例:
1 2 3 4 5 9
有关详细的堆排序请点击排序之堆排序。
可以说堆排序比较复杂,要想是用堆排序对数组进行排序首先需要建初堆以及进行调整堆,这两不是必不可少的。下面以大根堆为例来介绍建立堆以及调整堆
建初堆
void CreatHeap(int *str,int n){//n表示数组的大小
for(int i=n/2-1;i>=0;i--){
HeapAdjust(str,i,n);
}
}
调整堆
void HeapAdjust(int *str,int t,int n){//将数组变成大根堆
int fa,son;
fa=t;
son=2*fa+1;
while(son<n){
if(son+1<n&&str[son]<str[son+1])//找出儿子节点的最大值
son++;
if(str[fa]<str[son]){//判断儿子节点与父亲节点的大小,如果儿子节点大则交换父亲节点与儿子节点的位置
swap(&str[fa],&str[son]);
fa=son;
son=2*fa+1;
}
else//如果父亲节点大则直接跳出循环
return ;
}
}
下面代码将建初堆以及调整堆放在一起了
问题代码如下:
#include<iostream>
#define N 1010
using namespace std;
void swap(int *a,int *b){
int temp;
temp=*a;
*a=*b;
*b=temp;
}
void HeapAdjust(int *str,int t,int n){//将数组变成大根堆
int fa,son;
fa=t;
son=2*fa+1;
while(son<n){
if(son+1<n&&str[son]<str[son+1])//找出儿子节点的最大值
son++;
if(str[fa]<str[son]){//判断儿子节点与父亲节点的大小,如果儿子节点大则交换父亲节点与儿子节点的位置
swap(&str[fa],&str[son]);
fa=son;
son=2*fa+1;
}
else//如果父亲节点大则直接跳出循环
return ;
}
}
void Heap_sort(int *str,int n){
for(int i=(n/2)-1;i>=0;i--){
HeapAdjust(str,i,n);//把数组变成堆
}
for(int i=n-1;i>=0;i--){//交换堆的第一个元素与堆后面的元素,并把堆进行调整
swap(&str[0],&str[i]);
HeapAdjust(str,0,i);
}
}
int main(){
int n;
int str[N];
cin>>n;//输入数组的个数
for(int i=0;i<n;i++){
cin>>str[i];
}
Heap_sort(str,n);//堆排序
for(int i=0;i<n;i++)
cout<<str[i]<<" ";
return 0;
}
希望对大家能有所帮助。