欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

排序汇总

程序员文章站 2022-05-23 11:01:29
...

今天将之前学习的各种排序方法回顾重写了一遍,感觉还是代码写的太少了,要时刻提醒自己大神还是要代码敲出来的,将今天写的代码留在这吧,感觉过段时间会生疏,还要在来看看然后再敲几遍,简单的就没有注释了,针对自己开始疑惑的地方有注释,欢迎大家指点,直接上代码吧。

int HalfInsert(int *p,int b,int e,int data)//折半插入
{
    if(b>e)
        return -1;
    int m=b+(e-b)/2;
    int te=e;
    while(b<=te)
    {
        if(data<p[m])
            te=m-1;
        else if(data>p[m])
            b=m+1;
        else 
        {
            b=m;
            break;
        }

        m=b+(te-b)/2;
    }
    //b就是要插入的位置
    for(int i=e;i>=b;--i)
    {
        p[i+1]=p[i];
    }
    p[b]=data;
    return b;
}
void InsertionSort(int *p,int len)//插入排序,调用折半插入
{
    //从数组第二个数据开始做插入排序,第一个数据单独的不用排序
    for(int i=1;i<len;++i)
    {
        HalfInsert(p,0,i-1,p[i]);
    }
    //p[1] 是在p[0]p[0]间做插入
    //p[2] 是在p[0]p[1]间做插入
}
void QuickSort(int *p,int b,int e)//快排
{
    if(b>e)
        return;
    int key=b;
    for(int i=b+1;i<=e;++i)
    {
        if(p[i]<p[b])
        {
            ++key;
            if(key!=i)//排除相对于p[b]的第一个数与p[b]交换的情况
            {
                int t = p[i];
                p[i] = p[key];
                p[key] = t; 
            }
        }
    }
    if(key!=b)
    {
        int t = p[b];
        p[b] = p[key];
        p[key] = t;
    }
    QuickSort(p,b,key-1);
    QuickSort(p,key+1,e);
}
void MergeSort(int *p,int b,int e,int*help)//归并排序
{
    if(b>=e)
        return;
    int m=b+(e-b)/2;//数组划分点
    int index_L=b;//左部分起点
    int index_R=m+1;//右部分起点
    int index_help=b;//帮助数组起点
    MergeSort(p,index_L,m,help);
    MergeSort(p,index_R,e,help);
    while(index_L<=m&&index_R<=e)
    {
        if(p[index_L]<p[index_R])
            help[index_help++]=p[index_L++];
        else
            help[index_help++]=p[index_R++];
    }
    if(index_L>m)
    {
        while(index_R<=e)
        {
            help[index_help++]=p[index_R++];
        }
    }
    else
    {
        while(index_L<=m)
        {
            help[index_help++]=p[index_L++];
        }
    }
    for(int i=b;i<=e;++i)
    {
        p[i]=help[i];
    }
}
void SeleteSort(int *p,int len)//选择排序
{
    for(int i=0;i<len-1;++i)
    {
        int k=i;
        for(int j=i+1;j<len;++j)
        {
            if(p[k]<p[j])
                k=j;
        }
        if(k!=i)
        {
            int temp=p[k];
            p[k]=p[i];
            p[i]=temp;
        }
    }
}
void BubbleSort(int *p,int len)//冒泡排序
{
    for(int i=0;i<len-1;++i)
    {
        for(int j=0;j<len-i-1;++j)
        {
            if(p[j]>p[j+1])
            {
                int temp=p[j];
                p[j]=p[j+1];
                p[j+1]=temp;
            }
        }
    }
}
相关标签: 回顾