每个排序算法都适应于一种特定的数组情况,堆排序也不例外。普通的堆排序根据大堆小堆对数组排序,下面我们把大堆小堆抽象成一个大小堆,然后对数组排序。大堆的情况下,堆顶存放的是最大值,最后的排序情况就是从小到大。本文,就从从小到大的排序说起,建立编程。
代码如下:
#include "stdafx.h"
#include "string.h"
typedef struct stStack
{
int *a;
int n;
bool IsBigSortation;//是否是大堆
}stack;
void stackSort(int a[],int n,bool bIsBig);
void CreateStack(stack stk);
void swap(int &a,int &b);
void SiftDown(stack st,int m,int n );
void swap(int &a,int &b)
{
int tmp = a;
a = b;
b = tmp;
return;
}
void CreateStack(stack stk)
{
int i;
for(i=stk.n/2 - 1;i>=0;i--)
{
SiftDown(stk,i,stk.n-1 );
}
return;
}
void SiftDown(stack st,int m,int n )
{
int i;
int j;
int tmp;
i = m;
j = m * 2 + 1;
tmp = st.a[i];
while(j<= n)
{
if(j<n)
{
if(st.IsBigSortation == true && st.a[j] < st.a[j+1])
j++;
if(st.IsBigSortation == false && st.a[j] > st.a[j+1])
j++;
}
if(st.IsBigSortation == true && tmp >= st.a[j])
break;
if(st.IsBigSortation == false && tmp <= st.a[j])
break;
st.a[i] = st.a[j];
i = j;
j = j*2 + 1;
}
st.a[i] = tmp;
return;
}
void stackSort(int a[],int n,bool bIsBig)
{
stack stk;
int i;
memset(&stk,0,sizeof(stk));
stk.a = a;
stk.n = n;
stk.IsBigSortation = bIsBig;
CreateStack(stk);
for(i=n-1; i>0;i--)
{
swap(a[0],a[i]);
SiftDown(stk,0,i-1);
}
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[10] ={9,7,4,5,3,1,2,6,0,8};
stackSort(a, 10, false);
for(int i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\r\n");
return 0;
}
stackSort(a, 10, false)从大到小排序,stackSort(a, 10, true)从小到大排序。