首页 > 编程语言 > 详细

选择排序

时间:2020-08-01 15:56:00      阅读:105      评论:0      收藏:0      [点我收藏+]

简单选择排序

void SelectSort(int A[],int n) {
    int i,min,j;
    for(i=0; i<n-1; i++) { //一共进行n-1趟排序
        min=i;//记录最小元素的位置
        for(j=i+1; j<n; j++) //在A[i...n-1]中选择最小元素的位置
            if(A[j]<A[min])min=j;//更新最小元素的位置
        if(min!=j) swap(A[i],A[min]);//与第i个位置交换
    }
}

堆排序

void AdjustUp(int A[],int k)
 {//参数k为向上调整的结点,也是堆的元素个数 
     A[0]=A[k];
     int i=k/2;//若结点值大于双亲结点,就将双亲结点向下调,并继续向上比较 
     while(i>0&&A[i]<A[0])
     {
         A[k]=A[i];//双亲结点下调 
         k=i;
         i=k/2;//继续向上比较 
     }
     A[k]=A[0];//复制到最终位置 
 }
void AdjustDown(int A[],int k,int len)
{
    A[0]=A[k];//A[0]暂存 
    for(int i=2*k;i<=len;i++)//沿着关键字较大的子节点向下筛选 
    {
        if(i<len&&A[i]<A[i+1])
        i++;//取关键字值较大的子节点下标 
        if(A[0]>=A[i])break;//筛选结束 
        else{
            A[k]=A[i];//将A[i]调整到双亲结点上 
            k=i;//修改k,方便继续向下筛选 
        }
    }
    A[k]=A[0];//被筛选的结点的值放入最终位置 
}
void BuildMaxHeap(int A[],int len) {//建立大根堆 
    for(int i=len/2; i>0; i--) {//从i=[n/2]~1,反复调整堆 
        AdjustDown(A,i,len);
    }
}

void HeapSort(int A[],int len)
{
    BuildMaxHeap(A,len);//初始建堆 
    for(int i=len;i>1;i--)//n-1趟交换和建堆的过程 
    {
        swap(A[i],A[1]);//输出堆顶元素(和堆底元素交换) 
        AdjustDown(A,1,i-1);//整理,把剩余的i-1个元素整理成堆 
    }
 } 

 

选择排序

原文:https://www.cnblogs.com/tianyudizhua/p/13414725.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!