快排+归并排序的代码实现

快速排序实现代码:

思路:选取区间关键元素,设置左右下标,从右往左遍历,找到比它小的数字。就把右元素的值赋值给左元素所在的位置,之后从左往右遍历,遇到比关键元素大的,就把左元素的值赋给右元素所在的位置。最终这个关键值将会在它最终排序的位置,所以关键就不用再继续进行排序了。之后再分解为以关键字左右两边进行排序。就能做到快排了。

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int array[1002];

void QuickSort(int start,int end)
{
    if( start  >= end)
        return ;
    int left = start,right = end;
    int key = array[start];
    while( left  < right)
    {
        while(array[right] >= key && (left < right))
        {
            right--;
        }
        array[left] = array[right];
        while(array[left] <= key && (left < right))
        {
            left++;
        }
        array[right] = array[left];
    }
    array[left] = key;
    QuickSort(start,left-1);
    QuickSort(left+1,end);
    return ;
}
int main()
{
    srand(time(NULL));
    for(int i = 0;i<=100;i++)
    {
        array[i] = rand()%300;
    }
    QuickSort(0,100);
    for(int i = 0;i<=100;i++)
    {
        printf("%d ",array[i]);
    }
}

归并排序。就是不断分解,直到只剩下两个数的时候,做插入排序。然后就能保证这俩数形成的小数组是有序的了,然后不断回溯回去,将多个小数组,两两做插入排序,再次形成多个小数组。最终形成一个大数组。看到这个介绍可以感受到,复杂度O(nlogn)并且是稳定的。但是归并需要额外的O(n)的辅助空间才能实现两两数组的插入排序。

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int array[1002];
int temp[1002];///归并排序需要另外开O(n)的空间用来排序

void ToOne(int start,int mid ,int end)
{
    int left = start;//左序列
    int cent = mid+1;//右边序列
    int t = 0;
    while(left <= cent && cent <= end) ///把两边元素填充进temp
    {
        if(array[left] <= array[cent])
        {
            temp[t++] = array[left++];
        }
        else
        {
            temp[t++] = array[cent++];
        }
    }
    while(left <= mid) ///把剩余元素填充进temp
    {
        temp[t++] = array[left++];
    }
    while(cent <= end)
    {
        temp[t++] = array[cent++];
    }
    t = 0;
    while(start <= end)
    {
        array[start++] = temp[t++];
    }
}
void mergesort(int start,int  end)
{
    if(start < end)
    {
        int mid = (end - start) / 2 + start; ///等同于 (end+start)/2 防止溢出
        mergesort(start,mid);
        mergesort(mid+1,end);
        ToOne(start,mid,end);
    }
}
int main()
{
    srand(time(NULL));
    for(int i = 0;i<=100;i++)
    {
        array[i] = rand()%300;
    }
    mergesort(0,100);
    for(int i = 0;i<=100;i++)
    {
        printf("%d ",array[i]);
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值