算法基础(1) 持续更新

    本篇文章我们讲解两种在算法中常用的排序:归并排序和快速排序

归并排序

首先我们先来说一下归并排序的原理,之后再去分析具体的代码是如何实现的

什么是归并排序:归并排序是将一段无序的数组,通过归并排序的方式使这段无序的数组变成一段有序的数组,将这段数组变得有序的一种算法实现

归并排序的大概的思路:首先什么是归并呢,归并的意思就是将两端数组合并成为一段数组,所以我们需要取出来一个点作为一个基准点,将这个数列分为两列,以基准点左右分为两段数组,然后设置两个指针,一个指针指向的是第一段数组的第一个数,另一个数组指向的是第二段数组里的第一个数,然后用这两个指针指向的分别的两个数组,分别进行比较,如果左边的指针所指向数组比较右边的数组小,我们就将这个较小的指针所指向的数组存入到我们的临时数组中去。

归并排序的总结:这个需要一个临时的一个数组,将我们的比较好的数,存入到我们的临时数组中,然后再将我们的临时的数组,重新的返回我们之前的数组即可,那么我们如何存放呢,这就需要我们按照上面的做法,将一个数组分成两段,然后设置两个左右的指针,分别进行比较,将比较出来较小的那个存入我们的临时数组中去,,在进行这些之前,我们还要将原数组的两侧分别的去进行递归,将左侧的数组进行递归,同理将右侧的也进行递归,在进行我们刚才说的流程,这就是大概的归并排序,接下来我们讲一下如何将这个思路转换为代码去实现

//接下来我们先进行主函数的实现,在进行merge_sort函数的实现
#include<iostream>
#include<cstdio>

using namespace std;

//在这里我们需要定义两个数组去存放我们的数据
//一个数组作为临时存储的数组
//另一个数组作为我们正常的存储数组

const int N = 100020;
int tmp[N};
int a[N};

int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);

    merge_sort(a, 0, n - 1);

    for (int i = 0; i < n; i ++ ) printf("%d ", a[i]);

    return 0;
}

这个就是我们如何处理输入和输出的,接下来我们来讲解一下merge_sort里的模板是去如何实现的

在进行实现的时候需要记住几个大概的步骤,分别是先进行递归,接下来惊醒将数组分成左右两段,再找到指针,分别对两个指针所指向的数组进行比较,然后将比较小的数存放到我们的临时数组中去,最后得到了我们的临时数组,最后将数组再存回我们的数组中,接下来就是我们的代码的实现

void merge_sort(int q[],int l,int r)
{
if(l>=r) return;//如果不能进行那么我们就直接将数组进行返回
int mid = l+r>>1;//我们将中间取出来做为我们的分界点

merge_sort(q,0,mid),merge_sort(q,mid+1,r);//进行我们的递归排序,分别将左右两侧进行递归


int i = l,j = mid+1,k=0;//我们将数组分为左右两侧

while(i<=mid&&j<=r)//只要i没有到达右侧,j没有到达左侧就进行循环
if(q[i]<=q[j])//存进较小的数字
tem[k] = q[i];
else
tem[k] = q[j];

//当我们发现还有的数字还没有存入就直接进行存入
while(i<=mid)tem[k] = q[i];
while(j<=r)tem[k] = q[j];

//最后我们将tem的数组返回到q数组中去
for(int i = l,j = 0;i<=r;i,j)
q[i] = tem[j];
}

这上面就是我们实现归并排序的方法,接下来就来讲一下快速排序的实现

快速排序的作用:快速排序的作用和归并排序的作用是一样的,将一串无序的数组变为有序,下面将讲解我们对快速排序的基本思想

快速排序的思想:快速排序的话,我们同样是需要两个指针,将两个指针分别指向数组的左侧和右侧,还需要定义一个基准数,也就是将我们的指针,指向在数组的前面,分别对两个指针所指向的数与我们的基准数进行比较,比较完成后我们就进行递归,将进行完一次的数组在进行递归,接下来我们就会给出,快排的模板

#include<iostream>

using namespace std;
const int N = 100020;
int q[N];
void quick_sort(int q[], int l, int r)
{
    if (l >= r)return;//如果不成立我们就直接返回

   //定义两个指针,分别指向指针的左侧和右侧,防止数组的越界,所以我们没有指向数组的第0号位
    int i = l - 1; int j = r + 1;
    int x = q[(l+r)>>1];
   //找出来一个x
    while (i < j)//只要两个指针还能进行比较我们就进行比较
    {
        do i++; while (q[i] < x);//这个数组比x的数组小,指针就右移一位
        do j--; while (q[j] > x);//对于j也是同理
        if (i < j)swap(q[i], q[j]);//然后将两个数组进行交换
    }
    //分别递归两侧的数组
    quick_sort(q, l, j);
    quick_sort(q, j + 1, r);
}
//接下开的就是我们对quick_sort的打印的实现
int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
        scanf("%d", &q[i]);
    quick_sort(q, 0, n - 1);
    for (int i = 0; i < n; i++)
        printf("%d ", q[i]);
    return 0;
}

以上就是我们对快排和归并排序的模板总结,接下来还会继续更新算法基础,给初学算法的同学额打好基础。

看都看到这里,求个关注和点赞,谢谢大家!!!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值