首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

堆排序解决方案

2013-01-17 
堆排序void HeapAdjust(int s,int high){edges[0].weightedges[s].weightedges[0].beginedges[s].begin

堆排序
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;
}

热点排行