提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言AcWing算法学习第一节
  • 一、排序
    • 1.快速排序
    • 2.归并排序
  • 总结:这些模板一定要理解着学习,但是先理解尽力去理解,然后给这个模板背下来,然后你才可以在比赛的时候给他用最少的时间做出来,所以必须特别熟练

前言

请大家带着认真读这篇文章,因为这是梦想开始的地方


提示:以下是本篇文章正文内容,下面案例可供参考

一、快速排序

示例:让一些数字以从大到小或从小到大排序的一种方法.

1.输入和输出

代码如下(示例):

//基础输入输出
#include<stdio.h>
int main()
{int arr[100010];int n,k;scanf("%d %d",&n,&k);for(int i=0;i<n;i++) scanf("%d",&arr[i]);quick_sort(arr,0,n-1);for(int i=0;i<n;i++) {if(i+1==k) printf("%d",arr[i]);}return 0;
}

2.函数书写

代码如下(示例):

void quick_sort(int arr[],int l,int r)
{if(l>=r) return;  //特殊情况特殊讨论int i=l-1,j=r+1,x=arr[l]; //第一点 指针思想,i是初始指针,j是末尾指针然后通过左右遍历去//实现交换,指针配合reverse逆序其实这种思想很常见,只能说见怪不怪吧。//第二点就是x=arr[l]就是以这个值为边界,去左边排比他大的或小的 右边排比他小或大的.while(i<j){do i++;while(arr[i]<x);do j--;while(arr[j]>x);if(i<j){int tmp=arr[i];arr[i]=arr[j];arr[j]=tmp;}}quick_sort(arr,l,j);  //递归实现左边可以顺序quick_sort(arr,j+1,r);//递归实现右边可以顺序
}

3.总代码的默写

#include<stdio.h>
void quick_sort(int arr[],int l,int r)
{if(l>=r) return;int i=l-1,j=r+1,x=arr[l];while(i<j){do i++;while(arr[i]<x);do j--;while(arr[j]>x);if(i<j){int tmp=arr[i];arr[i]=arr[j];arr[j]=tmp;}}quick_sort(arr,l,j);quick_sort(arr,j+1,r);
}
int main()
{int arr[100010];int n,k;scanf("%d %d",&n,&k);for(int i=0;i<n;i++) scanf("%d",&arr[i]);quick_sort(arr,0,n-1);for(int i=0;i<n;i++) {if(i+1==k) printf("%d",arr[i]);}return 0;
}
//我再强调一遍,一定要把模板会背,并且练到纯熟.

二、归并排序

1.输入和输出

#include<stdio.h>
const int N=100010;
int arr[N],tmp[N];
void merge_sprt(int arr[],int l,int r)
int main()
{int n;scanf("%d",&n);for(int i=0;i<n;i++) scanf("%d",&arr[i]);merge_sprt(arr,0,n-1);for(int i=0;i<n;i++) printf("%d ",arr[i]);return 0;
}

2.函数书写

void merge_sprt(int arr[],int l,int r)
{if(l>=r) return;int mid=(l+r)/2;//归并思想其实就是分治二分,所以用到了midmerge_sprt(arr,l,mid),merge_sprt(arr,mid+1,r);//把大于这个的放到一边,不大于的放到另一边int i=l,j=mid+1,k=0;while(i<=mid&&j<=r)//这里tmp[]类似于book[]数组名作用就是装入到里面而已.{if(arr[i]<=arr[j]) tmp[k++]=arr[i++];else tmp[k++]=arr[j++];}while(i<=mid) tmp[k++]=arr[i++];while(j<=r) tmp[k++]=arr[j++];for(int i=l,j=0;i<=r;i++,j++) arr[i]=tmp[j];//当然装了还要物归原主的,方便打印的.}

3.总代码的默写

#include<stdio.h>
const int N=100010;
int arr[N],tmp[N];void merge_sprt(int arr[],int l,int r)
{if(l>=r) return;int mid=(l+r)/2;merge_sprt(arr,l,mid),merge_sprt(arr,mid+1,r);int i=l,j=mid+1,k=0;while(i<=mid&&j<=r){if(arr[i]<=arr[j]) tmp[k++]=arr[i++];else tmp[k++]=arr[j++];}while(i<=mid) tmp[k++]=arr[i++];while(j<=r) tmp[k++]=arr[j++];for(int i=l,j=0;i<=r;i++,j++) arr[i]=tmp[j];}
int main()
{int n;scanf("%d",&n);for(int i=0;i<n;i++) scanf("%d",&arr[i]);merge_sprt(arr,0,n-1);for(int i=0;i<n;i++) printf("%d ",arr[i]);return 0;
}

练习题目:、


题意理解
这道题目显然是要我们将一个无序数列排序,成为具有升序性质的升序序列.

算法处理
一道排序题目,数据范围是关键,我们发现这道题目只能让我们使用O(nlogn)O(nlogn)的算法,显然我们可以选择快速排序,归并排序等算法,这里我们就使用快速排序

#include<stdio.h>
int arr[100010];void quick_sort(int arr[],int l,int r)
{if(l>=r) return;int i=l-1,j=l+1,x=arr[l];while(i<j){do i++;while(arr[i]>x);do j--;while(arr[j]<x);if(i<j){int tmp=arr[i];arr[i]=arr[j];arr[j]=tmp;}}quick_sort(arr,l,j);quick_sort(arr,j+1,r);}int main()
{int n;scanf("%d",&n);for(int i=0;i<n;i++) scanf("%d",&arr[i]);quick_sort(arr,0,n-1);for(int i=0;i<n;i++) printf("%d ",arr[i]);return 0;
}

#include<stdio.h>
void quick_sort(int arr[],int l,int r)
{if(l>=r) return;int i=l-1,j=r+1,x=arr[l];while(i<j){do i++;while(arr[i]<x);do j--;while(arr[j]>x);if(i<j){int tmp=arr[i];arr[i]=arr[j];arr[j]=tmp;}}quick_sort(arr,l,j);quick_sort(arr,j+1,r);
}
int main()
{int arr[100010];int n,k;scanf("%d %d",&n,&k);for(int i=0;i<n;i++) scanf("%d",&arr[i]);quick_sort(arr,0,n-1);for(int i=0;i<n;i++) {if(i+1==k) printf("%d",arr[i]);}return 0;
}

题意理解
题意很清晰,就是让我们使用快速排序算法,求解第K小的数.

算法选择
快速排序算法,显然是我们不二选择.毕竟这是一道模板题目

题意理解
这道题目还是让我们排序,只不过这里强制要求我们使用归并排序,所以既然如此的话,让我们好好地康康这道题目.

算法处理
归并排序,它有两大核心操作.

一个是将数组一分为二,一个无序的数组成为两个数组.

另外一个操作就是,合二为一,将两个有序数组合并成为一个有序数组.

#include<stdio.h>
const int N=100010;
int arr[N],tmp[N];void merge_sprt(int arr[],int l,int r)
{if(l>=r) return;int mid=(l+r)/2;merge_sprt(arr,l,mid),merge_sprt(arr,mid+1,r);int i=l,j=mid+1,k=0;while(i<=mid&&j<=r){if(arr[i]<=arr[j]) tmp[k++]=arr[i++];else tmp[k++]=arr[j++];}while(i<=mid) tmp[k++]=arr[i++];while(j<=r) tmp[k++]=arr[j++];for(int i=l,j=0;i<=r;i++,j++) arr[i]=tmp[j];}
int main()
{int n;scanf("%d",&n);for(int i=0;i<n;i++) scanf("%d",&arr[i]);merge_sprt(arr,0,n-1);for(int i=0;i<n;i++) printf("%d ",arr[i]);return 0;
}

总结

1.模板固然重要但是不要忘了初心是为了学习,是为了自己变得更强,而不是为了竞赛获奖,竞赛只是编程的一部分不是全部,有这样的心态才能走好这条路,否则你会虚荣,攀比,慢慢迷失自己,加油吧,少年!

2.思考什么是卷?什么是细?(下期回答)

算法学习---快速排序和归并排序.相关推荐

  1. 【算法】快速排序与归并排序对比

    算法 系列博客 [算法]刷题范围建议 和 代码规范 [算法]复杂度理论 ( 时间复杂度 ) [字符串]最长回文子串 ( 蛮力算法 ) [字符串]最长回文子串 ( 中心线枚举算法 ) [字符串]最长回文 ...

  2. 算法学习 - 快速排序

    首先放上我学习快速排序的知识来源,得益于慕课网上的一位良师,波波老师,放上课程链接:coding.imooc.com/class/71.ht- 诚心推荐.另外波波老师在慕课网上还有很多优质的课程,关于 ...

  3. 冒泡和快速排序的时间复杂度_java 八大排序算法 冒泡排序 快速排序 堆排序 归并排序 等...

    八大排序算法 一.直接插入 1.基本思路 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环 ...

  4. 九大内部排序算法(快速排序、归并排序、堆排序、希尔排序、基数排序)

    排序(Sorting)是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列. 文章目录 由于待排序的记录数量不同,使得排序过程中涉及的存储器 ...

  5. 半路出家的算法学习——快速排序

    作为一名本科苦逼的机械狗,研究生转入自动化新坑,结果算法课全程懵逼....emmm跑题了,作为一个用了三年matlab来学会了编程的人,类.指针啥的一向不懂,考虑问题更多的是从矩阵的方面去想,写些东西 ...

  6. 理解快速排序 | 打通算法学习的任督二脉

    本文作者胡光 前百度高级算法研发工程师,ACM 国际大学生程序设计大赛亚洲区金牌获得者 具体内容来自他在极客时间开设的免费公开课<常用算法 25 讲> 排序算法在工作中最常用,也是学习很多 ...

  7. 重点算法排序之快速排序、归并排序(上篇)

    文章目录 一.排序的概念及常见的排序算法 二.快速排序的思想及代码详解 2.1 快速排序的思想 2.2 挖坑法 2.2.1 挖坑法实现思想 2.2.2 挖坑法举例 2.2.3 挖坑法代码实现 2.3 ...

  8. 冒泡和快速排序的时间复杂度_排序算法学习分享(二)交换排序---冒泡排序与快速排序...

    排序,也称为排序算法,可以说是我们学习算法的过程中遇到的第一个门槛,也是实际应用中使用得较为频繁的算法,我将自己对所学的排序算法进行一个归纳总结与分享,如有错误,欢迎指正! 排序算法学习分享(一)选择 ...

  9. 算法学习之快速排序的C语言实现

    近几天在学习简单算法,今天看了一个快速排序和堆排序,堆排序还没搞懂,还是先把快速排序搞清楚吧 教程网上一艘一大堆,这里选择一个讲的比较通俗的的一个吧: http://blog.csdn.net/mor ...

最新文章

  1. node-webkit教程(16)调试typescript
  2. while/do while /for 循环中continue
  3. js 页面跳转保存状态
  4. 解析xml的问题未解决
  5. win8/Metro开发系列二 Xaml数据绑定
  6. Python MyQR
  7. javascript 动态修改css样式
  8. 团队开发——个人工作总结04
  9. 【Alpha 冲刺】 2/12
  10. 第七课 Linux裸机开发+SourceInsight3.5使用+notepad++使用
  11. 网页版扫雷(HTML/CSS/JS实践)
  12. win10电脑桌面透明便签_win10系统在桌面添加透明便签的图文技巧
  13. 【python】BMR基础代谢率计算器的设计
  14. 巧用阿里云同步k8s.gcr镜像
  15. 利用python_opencv和dlib实现从视频中抓取人脸照片并保存(亲测有效)
  16. 上饶服务器租用 游戏服务器如何选择?
  17. STM32内存空间个人见解
  18. 变电站机器人的控制部分
  19. 仪器仪表应用,国产IC用于替代AD7792,AD7793的型号分享,完全P=P
  20. 第二章 机遇就是选择大于努力

热门文章

  1. 【数据结构与算法】第二篇:算法部分
  2. 梦想天空(关注前端开发技术 html5+css3)
  3. glow 安装使用指南:一款基于终端的 Markdown 阅读器
  4. Go语言实践[回顾]教程11--学习成绩统计的示例【下】
  5. 海龟绘图,画一个牡丹
  6. java中setHideValue的用法,推荐个不错的表单Input的高级用法11例_经验交流 - hidefocus...
  7. php 如何处理图片流,PHP 处理图片
  8. 【解决办法】eclipse中的jsp文件修改,浏览器没有自动同步更新,而是需要重启tomcat才能更新
  9. Earth Engine下地表温度反演
  10. 战神背光键盘如何关系_全彩背光 精灵战神背光游戏键盘评测