永发信息网

【急求】C语言中堆排序如何输出排序前各数字的序号?

答案:2  悬赏:0  手机版
解决时间 2021-02-09 01:31
堆排序,想实现排序后输出的数字前还对应的是排序前数字的序号,如排序后8前的序号还是1,求大神帮忙!
现在的代码如下,请修改,谢谢!
void HeapSort(float num[],int size);
void BuildHeap(float num[],int size);
void PercolateDown(float num[],int index,int size);
void PrintHeap(const char* strMsg,float array[],int nLength);
void Swap(float num[],int v ,int u);

int main(int argc, char *argv[])

{
int data[13]={8,5,4,6,13,7,1,9,12,11,3,10,2};
HeapSort(data,13);

system("PAUSE");
return 0; }

void HeapSort(float num[], int size)
{
int i;
int iLength = size;
PrintHeap("Before Sort:\n",num,iLength);

BuildHeap(num,size);

for (i = iLength - 1;i >= 1; i --){
Swap(num, 0 ,i);
size--;

PercolateDown(num, 0 ,size);
}

PrintHeap("Sort Heap:\n",num,iLength);
}

void BuildHeap (float num[], int size)
{
int i;
for(i = size / 2 - 1; i >= 0; i --){
PercolateDown(num , i , size);

}
}
void PercolateDown(float num[] , int index , int size)
{

int min;
while (index*2+1 < size){
min = index*2 + 1;
if(index * 2 + 2 < size){
if(num[min] > num[index * 2 + 2]){
min = index * 2 + 2;
}

}

if (num[index] < num[min]){
break;

} else {
Swap(num, index , min);
index = min;
}
}
}
void Swap(float num[] , int v ,int u)
{
int temp = num [v];

num[v] = num[u];
num[u] = temp;
}
void PrintHeap(const char* strMsg,float array[],int nLength)
{
int i;
printf("%s",strMsg);

for(i = 1;i <= nLength; i ++){
printf("%d %f\n",i,array[i]);
}
}

前面的main函数是随便加的,其实HeapSort(float num[], int size)是我要调用的子函数,我知道要加一个数组存储序号但不知道要加在哪。。。

对了,最上边还有两个头文件= =
#include

#include

另,我后面的程序中还要用到序号,希望大神可以教我怎样把存储序号的数组传递到后面的程序中使用,谢谢!

或者您帮忙在写一个排序的子函数也行,后面能调用可以,重点是能输出排序前的序号
最佳答案
最简单的办法:再增加一个数组int d0[13]={0,1,2,3,4,5,6,7,8,9,10,11,12}
当交换data数组中data[i]和data[j]时,同步地交换d0数组中d0[i]和d0[j]就可以了。这样当排序完成后,数据data[k]的排序前序号就是d0[k]。
全部回答
#include void shift(int a[] , int i , int m) { int k , t; t = a[i]; k = 2 * i + 1; while (k < m) { if ((k < m - 1) && (a[k] < a[k+1])) k ++; if (t < a[k]) {a[i] = a[k]; i = k; k = 2 * i + 1;} else break; } a[i] = t; } void heap(int a[] , int n) //a 为排序数组,n为数组大小(编号0-n-1) { int i , k; for (i = n/2-1; i >= 0; i --) shift(a , i , n); for (i = n-1; i >= 1; i --) { k = a[0]; a[0] = a[i]; a[i] = k; shift(a , 0 , i); } } void main() { int a[10],i; for(i=0;i<10;i++) scanf("%d",&a[i]); heap(a,10); for(i=0;i<10;i++) printf("%d",a[i]); }
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
通大科技地址在哪,我要去那里办事
苹果ipad2屏幕底色原来是黑色,现在变成红色了
下列与“青出于蓝而胜于蓝,冰,水为之而寒于
警世碑地址有知道的么?有点事想过去
硅烷交联hdpe工作温度120℃可以吗
进出水管布置不得产生水流短路,必要时应设导
咕嘟欢乐火锅在哪里啊,我有事要去这个地方
由103个氨基酸形成某蛋白质的过程中,分子量
善缘堂蜂胶是骗局么
手机是三星s4 充电可以随时充随时拔掉吗?
上海外国语大学雅思托福考试培训中心地址在哪
广州哪里黄金便宜点
如何推销手机产品
从塘沽外滩做哪路公交车到天津西青梨园头村李
jeep指南者轮胎换什么胎比较好
推荐资讯
与性别有关的染色体叫性染色体,女性的一对性
秦腔断桥讲的是什么
如图所示,请解这道关于一次函数的数学应用题
office2010 Excel 日期问题
战地4运行游戏为什么要打开网页
用简便方法计算 1.2×2.5+2.8×2.
石家湾在哪里啊,我有事要去这个地方
将游戏安装目录下"data"文件夹内的js3_00_02_
华钥垂钓中心地址在哪,我要去那里办事
如果通过92回收来回收旧衣服,问下,他们的回
生命科学专业到底属于工学、理学还是医学?
工程监理企业的资质等级标准中,综合资质标准
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?