C语言实现六种排序算法

C语言实现六种排序算法

下载完整源代码
Java语言版点此穿越

冒泡排序

从左到右依次比较相邻两个元素,如果大的在左边则交换这两个元素。
如果在依次遍历中执行过交换操作,则再次遍历,直到不发生元素交换。

int * sortByMaopao(int * num,int length)
{
    bool flag=true;
    while(flag==true)
    {
        flag=false;
        for(int i=0;i<length-1;i++)
        {
            if(num[i]>num[i+1])
            {
                num[i]=num[i]+num[i+1]-(num[i+1]=num[i]);
                flag=true;
            }
        }
    }
    return num;
}

插入排序

从左到右遍历每个元素,遍历到的元素作为待定元素。
待定元素与其左边的元素逐个相比,如果左边大则交换,如果右边大则遍历下一个待定元素。

int * sortByCharu(int * num,int length)
{
    for(int i=1;i<length;i++)
    {
        for(int j=i;j>0;j--)
        {
            if(num[j-1]>num[j])
            {
                num[j]=num[j]+num[j-1]-(num[j-1]=num[j]);
            }
        }
    }

    return num;
}

归并排序

如果被排序数组长度大于2,将要排序的数组从中间分为左右两组,分别递归执行归并排序,然后将排序后的两组有序数组进行排序合并。
如果被排序数组长度不大于2,则直接进行排序。

int * sortByGuibing(int * num,int length)
{
    sort_guibing(num,0,length-1);
    return num;
}

int * sort_guibing(int * num, int start,int end)
{
    int mid=(start+end)/2;
    if(end-start>1){
        sort_guibing(num,start,mid);
        sort_guibing(num,mid+1,end);
    }
    compare_guibing(num,start,mid,mid+1,end);
    return num;
}

int * compare_guibing(int *num,int start1,int end1,int start2,int end2)
{
    int * temp=(int *)malloc(sizeof(int)*(end2+1));
    for(int index=start1;index<=end2;index++)
    {
        temp[index]=num[index];
    }
    int i=start1,j=start2,point=start1;
    while(i<=end1&&j<=end2)
    {
        if(temp[i]<=temp[j]){
            num[point]=temp[i];
            point++;
            i++;
        }else
        {
            num[point]=temp[j];
            point++;
            j++;
        }
    }
    while(i<=end1)
    {
        num[point]=temp[i];
        point++;
        i++;
    }
    while(j<=end2)
    {
        num[point]=temp[j];
        point++;
        j++;
    }
    return num;
}

快速排序

假设最左边元素作为核心元素。
从最右边遍历数组与核心元素相比,遇到比其小的则交换位置并终止遍历,或者直到遍历到核心元素终止遍历。
再从核心元素原位置向右进行遍历,遇到比其大的则交换位置并终止遍历,或者直到遍历到核心元素终止遍历。
重复上面两句直到遍历完整个数组,此时核心元素的位置已经确定。
对核心元素左边的数组递归执行快速排序,对核心元素右边的数组递归执行快速排序。

int * sortByKuaisu(int * num,int length)
{
    sort_kuaisu(num,0,length-1);
    return num;
}

int * sort_kuaisu(int * num,int start,int end)
{
    int mid=compare_kuaisu(num,start,end);
    if(start<end){
        sort_kuaisu(num,start,mid-1);
        sort_kuaisu(num,mid+1,end);
    }
    return num;
}

int compare_kuaisu(int * num,int start,int end)
{
    int result=start;
    while(start<end)
    {
        while(end>start)
        {
            if(num[end]<num[start])
            {
                num[start]=num[start]+num[end]-(num[end]=num[start]);
                result=end;
                start++;
                break;
            }
            end--;
        }
        while(start<end)
        {
            if(num[start]>num[end])
            {
                num[start]=num[start]+num[end]-(num[end]=num[start]);
                result=start;
                end--;
                break;
            }
            start++;
        }
    }
    return result;
}

希尔排序

定义数组长度为偏移量。
如果偏移量比大于等于1则将偏移量除以2。
从偏移量位置向右遍历数组,将遍历到的元素与其左边相差偏移量个单位的元素进行比较,如果左边的小则交换后继续与左边相差偏移量个单位的元素比较。
遍历完成后偏移量折半,重复上一句。

int * sortByXier(int * num,int length)
{
    int mid=length;
    while(mid>=1)
    {
        mid/=2;
        for(int i=mid;i<length;i++)
        {
            int point = i;
            while(point-mid>=0&&num[point]<num[point-mid])
            {
                num[point]=num[point]+num[point-mid]-(num[point-mid]=num[point]);
                point-=mid;
            }

        }
    }
    return num;
}

选择排序

从左向右遍历数组,每个元素与其右边的所有元素相比,最小的放在所遍历的位置。

int * sortByXuanze(int *num,int length)
{
    for(int i=0;i<length;i++)
    {
        for(int j=i+1;j<length;j++)
        {
            if(num[j]<num[i])
            {
                num[i]=num[i]+num[j]-(num[j]=num[i]);
            }
        }
    }
    return num;
}

Java语言版点此穿越

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值