#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
typedef int ElemType;
typedef struct {
ElemType * elem;//存,申请的空间的首地址
int tab_length;//存储动态数组里元素的个数
}SSTable;
void ST_Init(SSTable &t,int len) {
t.tab_length=len;//元素个数,数组长度
t.elem = (ElemType *) malloc(sizeof(ElemType)*t.tab_length);
// int i;
// srand(time(NULL));//随机数
// for (i = 0; i < t.tab_length; i++)
// {
// t.elem[i] = rand() % 100;//0~99
// }
}
void Print(SSTable s)
{
int i;
for ( i = 0; i <s.tab_length ; ++i) {
printf("%3d",s.elem[i]);
}
printf("\n");
}
void swap(ElemType &a,ElemType &b)
{
int temp=a;
a=b;
b=temp;
}
void big_heap(SSTable &s,int i,int len)
{
int father=i,son;
son=2*i+1;//左孩子
while (son<len)
{
if(son+1<len&&s.elem[son]<s.elem[son+1])
{
son++;//拿到孩子中最大的
}
if(s.elem[son]>s.elem[father])
{
swap(s.elem[son],s.elem[father]);
father=son;
son=father*2+1;
} else{
break;
}
}
}
void heap_sort(SSTable &s)
{
int len=s.tab_length;
int i=s.tab_length/2-1;//最后一根子树的父结点
for ( ; i >=0 ; i--) {
big_heap(s,i,len);//最好 O(1),最差O(logn)
}
swap(s.elem[s.tab_length-1],s.elem[0]);
for ( i = s.tab_length-1; i >1 ; i--) {
big_heap(s,0,i);//都是O(logn)
swap(s.elem[i-1],s.elem[0]);
}
}
int main() {
SSTable t1;
ST_Init(t1,10);
int temp[10]={3,87,2,93,78,56,61,38,12,40};
memcpy(t1.elem,temp,sizeof (temp));
Print(t1);
heap_sort(t1);
Print(t1);
return 0;
}
数据结构:c 堆排序
最新推荐文章于 2024-10-31 13:56:46 发布