选择,堆排序,基数排序

选择排序

排序原理

设一个预留空间,存放每次选择的最小元素的下标。
开始循环:

  • 记录当前最小元素的下标
  • 从记录的最小元素下标的下一个元素开始:
    • 如果存在一个元素小于可用最小元素下标的元素值。
    • 将当前元素的下标给可用的最小元素下标,准备进行双方交换。
    • 如果:
      第i次选的最小元素下标不等于i,则将两个元素交换。
void selectsort(int a[ ],int n)
{
    int i,j,k;
    for(i=1,i<=n;i++)
    {
        k=i;
        for(j=i+1;j<=n;j++)
            if(a[j]<a[k]) k=j;
        if(k!=i)
        {
            a[0]=a[k];
            a[k]=a[j];
            a[j]=a[0];
        }
    }
}

堆排序

排序原理

第一步:先建立heapify函数。
设置根结点i为max,设置左孩子为2*i+1,设置右孩子为2*i+2。

  • 如果左孩子存在,且左孩子大于max,则将左孩子的值给max。
  • 如果右孩子存在,且右孩子大于max,则将右孩子的值给max。
  • 如果max不是根结点,交换max与根结点i的值。
  • 递归执行heapify本身。

第二步:进行堆排序
从根结点i开始,循环建堆。
从最后一个叶子结点开始,交换叶子结点与根结点的值,递归执行heapify堆化函数。

void heapify(int a[],int n,int i)
{
    int max=i;
    int Lson=2*i+1;
    int Rson=2*i+2;
    if(Lson <n && Lson > max)
        max=Lson;
    if(Rson <n && Rson >max)
        max=Rson;
    if(max!=i)
    {
        swap(&a[max],&a[i]);
    }
    heapify(a,n,i);
}
void heapsort(int a[],int n)
{
    int i;
    for(i=n/2-1;i>=0;i--) 
    //从根开始,对每一个存在的子堆进行堆化
        heapify(a,n,i);
    for(i=n-1;i>=0;i++)
    {
        swap(&a[0],&a[i]);
        heapify(a,n,i);
    }
}

基数排序

排序原理
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容