读书人

自己写的堆排序.帮忙看看有关问题出在

发布时间: 2012-08-16 12:02:16 作者: rapoo

自己写的堆排序......帮忙看看问题出在哪里了
[code=C/C++][/code]void duitiaozheng(int r[],int xiao,int ding)
{
int temp;
int jilu,dingwei;
dingwei=xiao;
for(int j=2*xiao;j<=ding;j=2*j)
{
if(r[j+1]<r[j+2] && j+2<=ding)
jilu=j+2;
else
jilu=j+1;
if(r[jilu]>r[dingwei])
{
temp=r[dingwei];
r[dingwei]=r[jilu];
r[jilu]=temp;
}
dingwei=jilu;
j=dingwei;
}
}
void duipaixu(int r[],int len)
{
int temp;
for(int i=len/2;i>0;i--)
{
duitiaozheng(r,i-1,len-1);
}
for(int j=len-1;j>=0;j--)
{
temp=r[0];
r[0]=r[j];
r[j]=temp;
duitiaozheng(r,0,j-1);
}

}

[解决办法]
仅供参考
#include<stdio.h>
#define LeftChild(i) (2 * (i))
void PercDown(int A[], int i, int N)
{
int child;
int temp;
for(temp = A[i]; LeftChild(i) < N; i = child)
{
child = LeftChild(i);
if(child < N && A[child + 1] > A[child])//判断,左孩子和右孩子大小。若右大,则Child指向右。child < N得判断,否则会越界。
child++;
if(temp < A[child])//把根左右孩子中最大的数和要插入的数比较,若插入的树大,则退出循环,
A[i] = A[child];//该跟位置就是要插入的位置,若小,则和该孩子换位置。
else
break;
}
A[i] = temp;//i就是最后要插入的位置。
}
void HeapSort(int A[], int N)
{
int i;
int temp;
for(i = N / 2; i > 0; i--)
PercDown(A, i, N);
for(i = N; i > 0; i--)
{
temp = A[1];
A[1] = A[i];
A[i] = temp;
PercDown(A, 1, i - 1);
}
}
void display(int A[])
{
int i;
for(i = 1; i < 8; i++)
printf("%d ", A[i]);
printf("\n");
}
int main(void)
{
int A[8];
A[1] = 31;
A[2] = 41;
A[3] = 59;
A[4] = 26;
A[5] = 53;
A[6] = 97;
A[7] = 58;
HeapSort(A, 7);
display(A);
return 0;
}
[解决办法]

探讨

仅供参考
#include<stdio.h>
#define LeftChild(i) (2 * (i))
void PercDown(int A[], int i, int N)
{
int child;
int temp;
for(temp = A[i]; LeftChild(i) < N; i = child)
{
child = LeftChild(i);
if(ch……

读书人网 >C语言

热点推荐