堆排序

来源:互联网 发布:淘宝买iphone6s 编辑:程序博客网 时间:2024/05/18 02:56

堆排序:

什么是堆:是一种数据结构,逻辑上市一个完全二叉树,存储上个是个数组

性质:两种堆,最小堆和最大堆。任意结点的key值都比他的孩子结点所有孩子结点的key值大

完全二叉树:除了叶子结点的那一层,其他层都是满的,而且叶子结点的排布是从左到右排的

 

存储:逐层按从左到右的顺序存储在数组中。Size,length   size<=length  数组最后一个元素的下表就是size,分配的空间是length

用途:堆排序、优先级队列

 

堆的基本操作:

  1. 给定任一数组,建立一个堆

  2. 优先级队列

  3. 性能:lgn



代码:

#include <iostream>

#include <limits.h>

#include <string.h>

#define MAMN 1000

using namespace std;

 

//对于子堆进行交换,形成子堆的最大堆

void MAX_HEAPIFY(int *A , int i , int size)

{

    int l = 2*i;

    int r = 2*i+1;

    int largest=0;

 

   if(l<=size&&A[l]>A[i])

        largest = l;

    else

        largest = i;

   if(r<=size&&A[r]>A[largest])

        largest = r;

    if(largest!=i){

        swap(A[i] , A[largest]);

        MAX_HEAPIFY(A,largest,size);

    }

}

 

//建立一个最大堆

void BUILD_MAX_HEAP(int *A,int size)

{

    for(int i=size/2 ; i>=1 ;i--)//且是从size/2开始,这是前任总结出来的规律

        MAX_HEAPIFY(A,i,size);

}

 

//进行排序!!

void HEAPSORT(int *A,int size)

{

    int len = size;

 

    BUILD_MAX_HEAP(A,len);

    for(int i=len ; i>0 ; i--){

        swap(A[1],A[i]);

        len-=1;

        MAX_HEAPIFY(A , 1 , len);

    }

}

 

int main()

{

    int i=0,j=0;

    int temp;

    int *p;

    int A[MAMN];

    int size=0;

 

    while(cin >> size){

        for(i=1 ; i<=size ; i++){

            cin >> A[i];

        }

 

        HEAPSORT(A,size);

 

        for(i=1 ; i<=size ; i++){

            cout << A[i]<< " ";

        }

 

        cout << endl;

    }

    return 0;

}

 


1 0
原创粉丝点击