算法(2)堆排序

        堆排序的操作時這樣的:

        //Heapfy

        有三個指針(不是C裏的物理指針)指向堆中的父結點和左右結點,分別是idx(父),left,right 。

        還有一個largest指向 這三者中最大的那個。

        如果,idx不等於largest,則交換 array[idx]和array[largets]的值,然後從largest開始向後遞歸。

        注意:這只是完成一次,父>左右結點的操作,並不是整個排序完成,說到底,這個操作只是把小的數放到下面的葉子去了。

        //buildHeap

        排序的時候,從一半的位置向前調用Heapfy,因爲一半的後面都是前面的子結點


        以下程序部分借鑑 http://blog.csdn.net/moxiaomomo/article/details/6331386

#include <iostream>

using namespace std;

void Heapfy(int A[],int idx,int max)      //建立最大堆  
{  
    int left=idx*2+1;  
    int right=left+1;  
    int largest;
      
  
    if(left<max&&A[left]>A[idx])
		largest=left; 
    else
		largest=idx;
  
    if(right<max&&A[largest]<A[right])
		largest=right; 
  
    if(largest!=idx)  
    {  
        int temp=A[largest];   //較大的節點值將交換到其所在節點的父節點  
        A[largest]=A[idx];  
        A[idx]=temp;  
  
        Heapfy(A,largest,max); //遞歸遍歷  
  
    }  
}  
  
void buildHeap(int A[],int ll)  
{  
    int len=ll;  
  
  
   for(int i=len/2-1;i>=0;--i)  //從一半的位置開始向前,因爲一半後面的都是前面的子節點
   {  
        Heapfy(A,i,len);     //建立最大堆,將堆中最大的值交換到根節點  
   }  
  
    for(int i=len-1;i>=1;--i)  
    {  
        int temp=A[0];   //將當前堆的根節點交換到堆尾的指定位置  
        A[0]=A[i];  
        A[i]=temp;  
  
        Heapfy(A,0,i);  //建立下一次的最大堆  
    }  
}  

void show_array(int *a,int len)
{
	cout<<endl;
	for(int i=0;i<len;i++)
	cout<<a[i]<<"	";
	cout<<endl;
}

int main()
{
	int array[6]={18,10,9,22,1,3};
	show_array(array,6);
	buildHeap(array,6);
	show_array(array,6);
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章