关闭

排序 堆排序 例程

769人阅读 评论(0) 收藏 举报
// heapSort.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<cstdlib>
using namespace std;

void MaxHeapify(int *a,int i,int size);				//保持最大堆特性
void BuildMaxHeap(int *a,int size)	;				//建立最大堆
void HeapSort(int *a,int size);							//堆排序
 inline int Parent(int i);							//算父节点
 inline int Left(int i);								//算左子节点
 inline int Right(int i);								//算右子节点
 void Display(int *a,int size) ;

int _tmain(int argc, _TCHAR* argv[])
{
	int size,*a;
	while(1)
	{
		cout<<"输入字符串长度:"<<endl;
		cin>>size;
		if(size > 0) {
			cout<<"请输入"<<size<<"个待排序数字:"<<endl;
			a = (int*)malloc(size*sizeof(int));//a = new int [size];
			for(int i=0; i<size; i++)
			{
				cin>>a[i];
			}
			HeapSort(a,size);
		}
		else
			cout<<"输入长度错误!"<<endl;

		Display(a,size);
	}
	return 0;
}

void MaxHeapify(int *a,int i,int size)				//保持最大堆特性
{
	int l,r,heapSize,largest,temp;
	l = Left(i);
	r = Right(i);
	heapSize =size;
	if (l<heapSize && a[l]>a[i] ) {
		largest = l;
	}
	else largest = i;

	if(r<heapSize && a[r]>a[largest]) {
		largest = r;
	}

	if(largest != i) {
		temp = a[i];
		a[i] = a[largest];
		a[largest] = temp;
		MaxHeapify(a,largest,heapSize);
	}

}

void BuildMaxHeap(int *a,int size)//建立最大堆
{
	int heapSize = size;
	int lengthArray =size;
	for(int i=lengthArray-1; i>=0; i--)
	{
		MaxHeapify(a,i,heapSize);
	}
}

void HeapSort(int *a,int size)				//堆排序
{
	int temp;
	int lengthArray = size;
	int heapSize = lengthArray;
	BuildMaxHeap(a,heapSize);
	for(int i=lengthArray-1; i>=1; i--)
	{
		temp = a[0];
		a[0] = a[i];
		a[i] = temp;
		heapSize -= 1;
		MaxHeapify(a,0,heapSize);
	}
}

inline int Parent(int i)//计算父节点
{
	i ++;
	return i/2-1;
}

inline int Left(int i)//计算子左节点
{
	i++;
	return 2*i-1;
}

inline int Right(int i)//计算子右节点
{
	i++;
	return 2*i;
}

void Display(int *a,int size)//打印函数
{
		for(int i=0; i<size; i++)    //打印数组
		{
			cout<<a[i]<<" ";
		}
		cout<<endl<<endl;
}

0
0
查看评论

算法入门--堆排序(最大堆,从小到大排序)

#include #include /*由于不会动态获得当前堆的元素数量heap_size,所以暂时用传参的方法,但是当多次运行后发现 为了防止错误应该把heap_size设置为全局变量,主函数初始化后,让它被各个函数操作过程中动态 改变也是可以的。 */ int left(int i)//返...
  • cfan0801
  • cfan0801
  • 2011-11-24 17:06
  • 1918

按照堆排序的方式原地进行升序排列

题目:将整数数组(7-6-3-5-4-1-2)按照堆排序的方式原地进行升序排列,请问在第一轮排序结束后,数组的顺序是() A.2-6-3-5-4-1-7 B.6-2-3-5-4-1-7 C.6-5-3-2-4-1-7 D.1-5-3-2-4-6-7 E.5-4-3-2-1-6-7 F.5...
  • NumberOneOrNothing
  • NumberOneOrNothing
  • 2017-04-24 20:20
  • 958

排序算法-堆排序

堆排序算法是建立在堆这种数据结构的基础上,其实堆听着很高端,其实很简单,就是一个二叉树,但是又特殊条件,就是其父节点比孩子节点都大(或都小)的堆称为最大堆(最小堆),瞬间感觉很简单了,最简单的保存方法就是直接用数组来保存。 给出一组数,我们要使用堆排序,首先需要建堆,但是这一组数首先肯定是不满足上...
  • y990041769
  • y990041769
  • 2015-06-22 21:29
  • 1628

二叉树及堆排序

一、二叉树的定义      在计算机科学中,二叉树是每个结点最多有两个子树的有序树。通常根的子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。二叉树的每个结点至多只有二棵子树(不...
  • StrongManTwo
  • StrongManTwo
  • 2014-12-16 11:16
  • 1354

用Python实现八大排序算法--堆排序

一、堆排序概述1.堆是一种数据结构 可以将堆看作一棵完全二叉树,这棵二叉树满足,任何一个非叶节点的值都不大于(或不小于)其左右孩子节点的值。 2.堆的存储 一般用数组来表示堆,若根节点存在于序号0处,i结点的父结点下表就为(i-1)/2,i结点的左右子结点下标分别为2i+1和2i+23.堆排序...
  • chibangyuxun
  • chibangyuxun
  • 2016-11-03 09:30
  • 1325

排序算法整理(6)堆排序的应用,top K 问题

top K问题是这样的,给定一组任意顺序的数,假设有n个。如何尽快地找到它们的前K个最大的数? 首先,既然是找前K个最大的数,那么最直观的办法是,n个数全部都排序,然后挑出前K个最大数。但是这样显然做了一些不必要的事儿。 利用堆这种数据结构,借助前文《排序算法整理(5)堆排序》中谈到的维护堆的函数,...
  • feliciafay
  • feliciafay
  • 2013-10-03 12:51
  • 5981

经典算法——堆排序笔试题

阿里巴巴2016研发工程师笔试选择题 1.将整数数组(7-6-3-5-4-1-2)按照堆排序的方式原地进行升序排列,请问在第一轮排序结束之后,数组的顺序是_____。
  • geekmanong
  • geekmanong
  • 2016-04-21 15:44
  • 1870

【java面试】算法篇之堆排序

一、堆的概念 堆是一棵顺序存储的完全二叉树。完全二叉树中所有非终端节点的值均不大于(或不小于)其左、右孩子节点的值。 其中每个节点的值小于等于其左、右孩子的值,这样的堆称为小根堆; 其中每个节点的值大于等于其左、右孩子的值,这样的堆称为大根堆; 二、要点 1.将数组构造成初始堆(若想升序则建立...
  • qq_21492635
  • qq_21492635
  • 2017-06-12 14:23
  • 503

【数据结构_1015_堆排序】一趟堆排序后的结果

#include #include #include using namespace std; int n; void dui(int k,int a[]) { int i=k,j=i*2; int item=a[i]; while(j<=n) { if(ja[j+1]) ...
  • IronCarrot
  • IronCarrot
  • 2017-05-13 19:47
  • 383

ios oc实现排序算法

oc实现的快速排序,冒泡排序,直接插入排序和折半插入排序,希尔排序,堆排序,直接选择排序 /*******************************快速排序 start**********************************/ //随即取 当前取...
  • u012367335
  • u012367335
  • 2016-06-29 10:53
  • 682
    个人资料
    • 访问:961499次
    • 积分:6373
    • 等级:
    • 排名:第4544名
    • 原创:100篇
    • 转载:63篇
    • 译文:1篇
    • 评论:78条
    最新评论