堆排序
void HeapAdjust(int s,int high)
{
edges[0].weight=edges[s].weight;
edges[0].begin=edges[s].begin;
edges[0].end=edges[s].end;
for(int j=2*s;j<=high;j*=2)
{
if(j<high&&edges[j].weight<edges[j+1].weight)
++j;
if(edges[0].weight>=edges[j].weight)
break;
edges[s].weight=edges[j].weight;
edges[s].begin=edges[j].begin;
edges[s].end=edges[j].end;
s=j;
}
edges[s].weight=edges[0].weight;
edges[s].begin=edges[0].begin;
edges[s].end=edges[0].end;
}
void HeapSort()
{
for(int i=high/2;i>0;--i)
HeapAdjust(i,high);
for(i=high;i>1;--i)
{
edges[0].weight=edges[1].weight;
edges[0].begin=edges[1].begin;
edges[0].end=edges[1].end;
edges[1].weight=edges[i].weight;
edges[1].begin=edges[i].begin;
edges[1].end=edges[i].end;
edges[i].weight=edges[0].weight;
edges[i].begin=edges[0].begin;
edges[i].end=edges[0].end;
HeapAdjust(1,i-1);
}
}
请教大师们指点,不知道这个算法的基本思路,特别是语句edges[0].weight=edges[s].weight;怎么总是互相的复值呢,能给出语句注释最好了,先谢谢了…… 算法,堆排序
[解决办法]
建议楼主先去看下堆,这样可以帮助理解堆排序。
http://blog.csdn.net/bruce_zeng/article/details/8439682这是我自己写的堆排序,希望对你有帮助
[解决办法]
这是我惯用的堆排序
#include<stdio.h>
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]={1,4,7,8,5,2,3,6,9,10};
heap(a,10);
for(int i=0;i<10;i++)
printf("%d ",a[i]);
getchar();
}
[解决办法]
具体看我的博客
http://blog.csdn.net/kuzuozhou/article/details/7981705
/*堆排序(大顶堆) 2011.9.14*/
#include<stdio.h>
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void HeapAdjust(int *a,int i,int size) //调整堆
{
int lchild=2*i; //i的左孩子节点序号
int rchild=2*i+1; //i的右孩子节点序号
int max=i; //临时变量
if(i<=size/2) //如果i不是叶节点就不用进行调整
{
if(lchild<=size&&a[lchild]>a[max])
{
max=lchild;
}
if(rchild<=size&&a[rchild]>a[max])
{
max=rchild;
}
if(max!=i)
{
swap(&a[i],&a[max]);
HeapAdjust(a,max,size); //避免调整之后以max为父节点的子树不是堆
}
}
}
void BuildHeap(int *a,int size) //建立堆
{
int i;
for(i=size/2;i>=1;i--) //非叶节点最大序号值为size/2
{
HeapAdjust(a,i,size);
}
}
void HeapSort(int *a,int size) //堆排序
{
int i;
BuildHeap(a,size);
for(i=size;i>=1;i--)
{
//cout<<a[1]<<" ";
swap(&a[1],&a[i]); //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面
//BuildHeap(a,i-1); //将余下元素重新建立为大顶堆
HeapAdjust(a,1,i-1); //重新调整堆顶节点成为大顶堆
}
}
int main(int argc, char *argv[])
{
//int a[]={0,16,20,3,11,17,8};
int a[100];
int size;
int i;
printf("给size赋值(1<=size<100):\n");
scanf("%d",&size);
printf("输入size个值给数组:\n");
for(i=1;i<=size;i++)
scanf("%d",&a[i]);
HeapSort(a,size);
printf("调整后的数组为:\n");
for(i=1;i<=size;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}