【algorithm】算法基础课---排序算法(附笔记 | 建议收藏)

简介: 【algorithm】算法基础课---排序算法(附笔记 | 建议收藏)

> 🚀write in front🚀

> 📝个人主页:认真写博客的夏目浅石.

> 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝

> 📣系列专栏:[AcWing算法学习笔记](https://blog.csdn.net/congfen214/category_12113497.html?spm=1001.2014.3001.5482)

> 💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊

> ✉️==如果无聊的话,就来逛逛我的博客栈吧==[stack-frame.cn](https://stack-frame.cn/)


@[TOC](文章目录)


---


# 前言


![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/f4e0159841ab450d861dde9e8fb5ba0d.gif#pic_center)


之前其实做过关于快速排序以及归并排序的博客笔记,但是我觉得我讲解的是不到位,所以我打算重新写一篇博客来帮助自己和大家梳理一下这两个算法模板以及配套的习题。


---



`其实就是把元素放到x的两侧`

# 一、快速排序

## 1.1快速排序的知识讲解

**快速排序的核心思想**:==基于分治==

**快速排序主要的内容就是:**


- 确定分界点:q[L],q[(L+R)/2],q[R] `其实就是分为左边界,中间值和右边界,甚至随机一个数`

- 调整区间,`其实就是把元素放到x的两侧`

- 递归处理左右两段

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/1939d89100124cbda460277a289190db.png)

下面就是具体==讲解步骤二的调整区间==

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/f5311e9ae85947df9be4a4eac3ff594c.png)

-  两个指针,i,j不断在这里面移动

- 当指针i==指向的元素<=x的时候就指针向右移动==,==同理指针j遇到>=x的时候就==指针向左移动

- 当i指针==指向的元素>=x的时候停下来==,等到j指针==指向的元素<=x的时候就也停下来==

- 最后使得这==两个元素进行swap交换一下==


![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/bc641c94d01e474887fc705296807292.png)

==以上就是快速排序的基础知识啦==,下面就要讲解一些习题来==巩固和练习==我们所讲解的知识点啦


**快排思想图:**

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/img_convert/629f1b0d45c08fa15795f95d23947e9e.gif#pic_center)




## 1.2快速排序的习题讲解

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/6deff163c8004196aa6fe04662036e6e.png)

C语言实现:

```c

#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;

}

```

C++实现:


```cpp

#include <iostream>


using namespace std;


const int N = 1000010;


int q[N];


void quick_sort(int q[],int l,int r)

{

   if (l>=r) return;


   int i=l-1, j=r+1,x=q[l+r>>1];

   while (i<j)

   {

       do i++; while (q[i]<x);

       do j--; while (q[j]>x);

       if (i<j) swap(q[i], q[j]);

   }


   quick_sort(q,l,j);

   quick_sort(q,j + 1,r);

}


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;

}

```

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/c6e38702a04f4dea98eb45c39b1cbc1b.png)


```c

#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;

}

```

其实C++和这个差不多,这里==不再赘述==了。


## 1.3对于快排的总结

其实就是自己要多练习几遍,反复敲打上几次就可以啦,然后隔一段时间再写一次看看自己是否可以再次写出来这个模板。


# 二、归并排序

## 2.1归并排序的知识讲解

**归并排序的核心思想**:==基于分治==

**归并排序主要的内容就是:**


- 确定分界点==mid=(left+right)/2==

- 递归排序left,right

- 归并,合二为一

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/6f71f106bd7c4727aa07171f1fb46d50.png)

下面就讲解一下,归并排序的==大致思路==:

- 先比较两个指针所指向的元素==谁大谁小==

- 谁小就拿下来放到新的保存数组里面,然后==指针向后挪动一位==,==依次类推==

- 直到其中==一个指针走向了终点的位置为止==,就可以把没有走完的直接补充到我们的==保存数组里面==

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/11f349dcf69e4d20b33f127cc8cc3747.png)

==归并排序的原理动图:==

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/img_convert/3f106342d2a8d00a008e27ebb03a277d.gif#pic_center)

## 2.2归并排序的习题讲解

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/07796665d6ae4d19b4a4697edf2baaac.png)


```c

#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;

}

```


---

## 2.3对于归并的总结

==主要对于逆序对问题很重要归并排序。==


# 总结

今天重新写了一篇关于AcWing算法基础课的一篇博客,其实我第一次看的时候会觉得很难,但是今天又看了一遍,发现,简单了很多,或许我们曾经不会的,或许以后就会慢慢掌握,==希望遇到困难的时候第一想到的不是退缩和放弃,而是拼尽全力试一试看看到底自己能不能行。==

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/559914a693f1440eab820bec630c16e3.png)

我是夏目浅石,希望和你一起学习进步,刷题无数!!!希望各位大佬能==一键三连==支持一下博主,hhhh~我们下期见喽


![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/img_convert/964d5c594e4c6ccea737be3c6b6bed4e.gif#pic_center)

==如果无聊的话,就来逛逛我的博客栈吧==[stack-frame.cn](https://stack-frame.cn/)


>✨$\textcolor{blue}{原创不易,还希望各位大佬支持一下}$ <br/>

>👍 $\textcolor{9c81c1}{点赞,你的认可是我创作的动力!}$ <br/>

>⭐️ $\textcolor{ed7976}{收藏,你的青睐是我努力的方向!}$ <br/>

>✏️ $\textcolor{98c091}{评论,你的意见是我进步的财富!}$ <br/>


相关文章
|
3月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
84 1
|
3月前
|
算法 索引
❤️算法笔记❤️-(每日一刷-141、环形链表)
❤️算法笔记❤️-(每日一刷-141、环形链表)
62 0
|
3月前
|
算法
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
62 0
|
3月前
|
算法
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
41 0
|
3月前
|
算法 API 计算机视觉
人脸识别笔记(一):通过yuface调包(参数量54K更快更小更准的算法) 来实现人脸识别
本文介绍了YuNet系列人脸检测算法的优化和使用,包括YuNet-s和YuNet-n,以及通过yuface库和onnx在不同场景下实现人脸检测的方法。
111 1
|
3月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
95 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
3月前
|
算法
❤️算法笔记❤️-(每日一刷-160、相交链表)
❤️算法笔记❤️-(每日一刷-160、相交链表)
28 1
|
3月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
32 0
|
3月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
40 0
|
3月前
|
算法
❤️算法笔记❤️-(每日一刷-26、删除有序数组的重复项)
❤️算法笔记❤️-(每日一刷-26、删除有序数组的重复项)
35 0

热门文章

最新文章