堆排序算法
很多情况下需要用到一些基础的排序算法,接下来分析堆排序算法:
1.把数组R[n]元素R[0]去掉后按照1 2 3 4 5 6 ... n 的完全二叉树形式排列
2.对每个小子树进行函数变换,找最大值替换双亲节点,循环执行,最终得到初始堆
3.将堆顶提出,最后一个元素同堆顶替换
一、构图分析:
二、 代码实现:
#include<iostream>
#include<iomanip>
using namespace std;
typedef int KeyType;
void partStack(KeyType R[],int low,int high)//初始堆构造时局部构造函数
{
int i = low;
int j = 2 * i;
KeyType temp = R[i];
while(j <= high)
{
if(j < high && R[j] < R[j+1])//挑选出左右孩子的较大值 bigger
j++;
if(temp < R[j])//挑选出 bigger与双亲节点的较大值biggest
{
R[i] = R[j];// biggest放在双亲节点的位置
i = j;//修改i与j的值,以便继续向下筛选,一次换位后对下一级子树影响的解决方法
j = 2 * i;
}
else break;//筛选结束
}
R[i] = temp;//被筛选节点的值放入最终位置
}
void stackQueue(KeyType R[],int n)
{
int i;
KeyType temp;
for( i = n/2; i >= 1; i-- )//循环建立初始堆,此处注意二叉树排序时,是从1开始即1 2 3 4 5 6 7 8 9 10 (如果从0开始,则0*2=0,不能满足partStack(R,i,n)函数要求
partStack(R,i,n);
for( i = n-1; i >=2; i-- )//此处由于在数组初始时添加了一个无关的R[0],故在此处应该不予考虑,否则输出需求数列会插入无关R[0]
{
temp = R[1];//将最后一个元素同堆顶对换
R[1] = R[i];
R[i] = temp;
partStack(R,1,i-1);//得到i-1个节点的堆
}
cout<<"用堆排序算法后所得序列(注:a[0]为辅助变量,可自己设置):"<<endl;
for(int k = 1; k < n; k++)//此处可通过控制k 的初始值来让R[0]不输出显示
{
cout<<setw(5)<<R[k];//格式输出
}
}
int main()
{
int a[7] = {18,1,4,22,4,123,5};//a[0]是插入辅助partStack(R,i,n)函数的无关量
stackQueue(a,7);
return 0;
}
三、算法分析:
时间复杂度:最差o(Nlog2N)
空间复杂度:o(1)