数据结构c语言版 内部选择排序编程,数据结构C语言版_选择排序

数据结构C语言版_选择排序

/*

数据结构C语言版 选择排序

P277-P282

编译环境:VC++6.0

日期:2011年2月16日

*/

#include

#include

#include

#include

// 记录类型

typedef struct

{

int key;// 关键字项

int otherinfo;// 其它数据项

}RedType;

#define MAXSIZE 30// 一个用作示例的小顺序表的最大长度

// 顺序表类型

typedef struct

{

RedType r[MAXSIZE+1];// r[0]闲置或用作哨兵单元

int length;// 顺序表长度

}SqList;

// 打印顺序表

void print(SqList L)

{

int i;

for(i = 1; i <= L.length; i++)

printf("(%d, %d) ", L.r[i].key, L.r[i].otherinfo);

printf("\n\n");

}

// 返回在L.r[i..L.length]中key最小的记录的序号

int SelectMinKey(SqList L,int i)

{

int min;

int j,k;

k=i; // 设第i个为最小

min=L.r[i].key;

for(j=i+1;j<=L.length;j++)

if(L.r[j].key

{

k=j;

min=L.r[j].key;

}

return k;

}

// 算法10.9

// 对顺序表L作简单选择排序。

void SelectSort(SqList *L)

{

int i,j;

RedType t;

for(i=1;i

{

// 选择第i小的记录,并交换到位

j=SelectMinKey(*L,i); // 在L.r[i..L.length]中选择key最小的记录

if(i!=j)

{

// 与第i个记录交换

t=(*L).r[i];

(*L).r[i]=(*L).r[j];

(*L).r[j]=t;

}

}

}

// 树形选择排序 P278

void TreeSort(SqList *L)

{

int i,j,j1,k,k1,l,n=(*L).length;

RedType *t;

l=(int)ceil(log(n)/log(2))+1;// 完全二叉树的层数

k=(int)pow(2,l)-1;// l层完全二叉树的结点总数

k1=(int)pow(2,l-1)-1;// l-1层完全二叉树的结点总数

t=(RedType*)malloc(k*sizeof(RedType)); // 二叉树采用顺序存储结构

for(i=1;i<=n;i++) // 将L.r赋给叶子结点

t[k1+i-1]=(*L).r[i];

for(i=k1+n;i

t[i].key=INT_MAX;

j1=k1;

j=k;

while(j1)

{

// 给非叶子结点赋值

for(i=j1;i

t[i].key

(t[(i+1)/2-1]=t[i+1]);

j=j1;

j1=(j1-1)/2;

}

for(i=0;i

{

(*L).r[i+1]=t[0]; // 将当前最小值赋给L.r[i]

j1=0;

for(j=1;j

t[2*j1+1].key == t[j1].key ?

(j1=2*j1+1) : (j1=2*j1+2);

t[j1].key=INT_MAX;

while(j1)

{

j1=(j1+1)/2-1; // 序号为j1的结点的双亲结点序号

t[2*j1+1].key <= t[2*j1+2].key

? (t[j1]=t[2*j1+1]) : (t[j1]=t[2*j1+2]);

}

}

free(t);

}

typedef SqList HeapType; // 堆采用顺序表存储表示

// 算法10.10 P282

// 已知H.r[s..m]中记录的关键字除H.r[s].key之外均满足堆的定义,本函数

// 调整H.r[s]的关键字,使H.r[s..m]成为一个大顶堆(对其中记录的关键字而言)

void HeapAdjust(HeapType *H,int s,int m)

{

RedType rc;

int j;

rc=(*H).r[s];

for(j=2*s;j<=m;j*=2)

{

// 沿key较大的孩子

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值