##堆排序
堆排序分为两个过程:
1、将原来无序的数列,转化成堆序列(建初识堆的过程);
2、输出堆顶元素并调整建新堆的过程;
数据结构伪代码:
typeof SqList HeapType;
void HeapAdjuistI(HeapType &H, int s , int m) {
rc = H.r(s);
for(j = 2*s;j<=m;j*=2){//沿key较大的孩子节点向下筛选
if(j<m && LT(H.r[j].key,H.r[j+1].key) ){
++j;
}
if(LT(rc.key,H.r[j].key) )break;
else{
H.r[s] = H.r[j];
s=j;
}
}
H.r[s] = rc;
}
void HeapSort(HeapType &H ) {
for(i = H.length/2;i>0;--i) {
HeapAdjust(H,i,H.length);
}
for(i = H.length;i>1;--i) {
H.r[1] <> H.r[i];
HeapAdjust(H, 1, i-1);
}
}
C语言代码:
//建堆的方法
void HeapAdjust (int array[], int s, int length)
{
int j;
for(;2*s +1<length-1;s = j)
{
j = 2*s +1;
if(j<length-1 && array[j+1] > array[j]) j++;
if(array[s] < array[j])
{
int temp = array[s];
array[s] = array[j];
array[j] = temp;
}else break;
int a;
for(a =0;a<10;a++)
{
printf("#%d ",array[a]);
}
printf("******************************\n");
}
}
//堆排序
void HeapSprt(int array[],int length)
{
int i;
for(i = length/2-1;i>=0;i--)
{
HeapAdjust(array,i,length);
}
for(i = length -1;i>=0;i--)
{
int temp;
temp = array[0];
array[0] = array[i];
array[i] = temp;
HeapAdjust(array,0,i);
}
}
int main()
{
int i;
int num[]={9,8,7,6,5,4,3,2,11,0};
HeapSprt(num,sizeof(num)/sizeof(int));
for(i=0;i<sizeof(num)/sizeof(int);i++)
{
printf("%d ",num[i]);
}
printf("\nok\n");
return 0;
}
时间效率:O(nlog2n);
空间效率:O(1);
稳定性:不稳定;