堆排序算法

堆排序算法

   很多情况下需要用到一些基础的排序算法,接下来分析堆排序算法

          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)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值