❥十大排序算法❥爆肝两万字保姆级教程(文字解析+图解+代码实现+例题)(代码片段)

静Yu 静Yu     2023-01-03     162

关键词:

什么是算法?

平时学计算机的小伙伴经常会听到算法这个词,那到底什么是算法呢?
算法并没有一个明确的定义,依我个人理解算法就是求解特定问题对解题思路和步骤的描述。

其实网上有很多十大算法的文章,各位大佬们写的都非常不错,大佬们水平很高,所以写的文章也是比较深的,我个人是个新人。写的这篇文章也特别适合刚入门学习的新人,简单入手。

十大排序算法

🎈冒泡排序

解析

冒泡排序是一种最基础的交换排序,就好比是我们平时喝的可乐,从底部一直冒到顶部。具体实现方法就是根据数的大小一点一点的往一侧移动,如果按照从小到大的顺序就将小的数从右边一直往左挪。
举例:将3.2.5.8.1这五个数从小到大排序

1.第一步,从右面开始比较,将小的数往左挪,1先和8比较,1小所以和8互换位置。

2.第二步,1再和5比较,还是1较小和5互换位置。

3.同理,直到全部比较之后,1最小在第一个位置

4.然后重新开始比较,8比5大所以不用挪动,然后2和5比较,5大不用移动,2再和3比较,2小和3互换位置,2再和1比较不用移动,再从右往左比较一遍,没有可以移动的最终结果为1.2.3.5.8

代码实现

function bubbleSort(arr) 
    var len = arr.length;
    for (var i = 0; i < len - 1; i++) 
        for (var j = 0; j < len - 1 - i; j++) 
            if (arr[j] > arr[j+1])         // 相邻元素两两对比
                var temp = arr[j+1];        // 元素交换
                arr[j+1] = arr[j];
                arr[j] = temp;
            
        
    
    return arr;

例题


本题目用到的就是冒泡排序,如果前一个数比后一个数大的话ans就加1

#include<stdio.h>
int main()

	int n;
	scanf("%d",&n);
	int a[n+1],ans;
	ans=0;
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=i;j++)
			if(a[i]<a[j])
				ans++;
	printf("%d",ans);

🎈选择排序

解析

选择排序顾名思义是从所有的元素中选择一个最小(大)的,放在序列的起始位置,然后再从剩余队列中,选择一个最小(大)的,放在第二个位置。
举例:将3.2.5.8.1这五个数从小到大排序
1.第一步:首先从所有队列中选出最小的那个数,最小的是1,然后放到序列首位


2.第二步:再从剩下的四个数中找到最小的那个,放到第二个位置,最小的是2

3.第三步:同理,依次排序下去,最终为

代码实现

function selectionSort(arr) 
    var len = arr.length;
    var minIndex, temp;
    for (var i = 0; i < len - 1; i++) 
        minIndex = i;
        for (var j = i + 1; j < len; j++) 
            if (arr[j] < arr[minIndex])      // 寻找最小的数
                minIndex = j;                 // 将最小数的索引保存
            
        
        temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    
    return arr;

例题


本人感觉此题就是为选择排序“量身定做”,第一个数选最大的,第二个数选最小的,第三个数是从剩下的数中选最大的。

#include<iostream>
using namespace std;
int main()
	int n=0;
	long int a[1000]=0;
	cin>>n;
	for(int i=0; i<n; i++) cin>>a[i];
	for(int i=0; i<n-1; i++) 
		int min_index = i;
		for(int j=i; j<n; j++) if(a[j] > a[min_index]) min_index = j;//找出第 i 小的数所在的位置
		swap(a[i],a[min_index]);//将第 i 小的数,放在第 i 个位置;如果刚好,就不用交换
		i++;
		for(int j=i; j<n; j++) if(a[j] < a[min_index]) min_index = j;//找出第 i 小的数所在的位置
		swap(a[i],a[min_index]);//将第 i 小的数,放在第 i 个位置;如果刚好,就不用交换

for(int i=0; i<n; i++) cout<<a[i]<<endl;

🎈插入排序

解析

插入排序的思想是分为有序序列和无序序列,将无序序列中的数插入到有序序列中,直到所有的数全部插入。
举例:将3.2.5.8.1这五个数从小到大排序
1.第一步:3为有序序列,2.5.8.1为无序序列,

2.将无序序列的第一个数拿出来插入到有序序列

3.然后将无序序列的5插入有序序列

4.同理

5.最终结果为

代码实现

function insertionSort(arr) 
    var len = arr.length;
    var preIndex, current;
    for (var i = 1; i < len; i++) 
        preIndex = i - 1;
        current = arr[i];
        while (preIndex >= 0 && arr[preIndex] > current) 
            arr[preIndex + 1] = arr[preIndex];
            preIndex--;
        
        arr[preIndex + 1] = current;
    
    return arr;


例题

题目描述
清华附小期末考试结束后,分别由数学、语文、英语按照学号顺序输入30名同学的成绩,班主任想知道三门课总分的最高分和最低分,以及取得总分最高分和最低分的两位同学的编号。(输入数据保证没有同分情况,编号由1到30)
输入描述
第一行输入编号为1-30的30位同学的数学成绩,分数之间用空格隔开;第二行输入语文成绩,第三行输入英语成绩
输出描述
输出四个数,分别是总分最高分,总分最低分,取得最高分同学的编号,取得最低分同学的编号

#include <iostream>

#include <stdlib.h>
using namespace std;
int main() 
int*math = new int[3];
int*chinese = new int[3];
int*english = new int[3];
for (int n = 0; n < 3; n++) 
cin >> math[n];

for (int n = 0; n < 3; n++) 
cin >> chinese[n];

for (int n = 0; n < 3; n++) 
cin >> english[n];

int*sum= new int[3];
int*order = new int[3];
for (int n = 0; n < 3; n++) 
sum[n] = math[n] + chinese[n] + english[n];
  
for (int n = 0; n <= 2; n++) 
order[n] = sum[n];

for (int n = 1; n <=2; n++)
int now = sum[n], space = 0;
while (now > sum[space])
space++;
for (int i = n; i > space; i--)
sum[i] = sum[i - 1];
sum[space] = now;

int max, min;
for (int n = 0; n <= 2; n++) 
if (order[2] == sum[n])
max = n;
if (order[0] == sum[n])
min = n;

cout << sum[2] << endl;
cout << sum[0] << endl;
cout << max<<endl;
cout << min<<endl;
system("pause");  
return 0;

🎈希尔排序

解析

希尔排序主要思想是将数据进行分组,然后对每一组数据进行插入排序,在每一组数据都有序后,再对所有的分组利用插入排序进行最后一次排序。可以说是对插入排序的升级版,通过减少数据交换的次数,以达到加快排序的速度。
举例:将3.2.5.8.1.6这六个数从小到大排序
1.第一步:分组依据为两个一组,六个数分为三组,第一个和第四个一组,第二个和第五个一组,第三个和第六个一组。
2.第二步:3和8相比,2和1相比,5和6相比,小的排前大的排后

3.第三步:然后再分成3/2=1组,直接所有的数据插入排序

代码实现

function shellSort(arr) 
    var len = arr.length;
    for (var gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) 
        // 注意:这里和动图演示的不一样,动图是分组执行,实际操作是多个分组交替执行
        for (var i = gap; i < len; i++) 
            var j = i;
            var current = arr[i];
            while (j - gap >= 0 && current < arr[j - gap]) 
                 arr[j] = arr[j - gap];
                 j = j - gap;
            
            arr[j] = current;
        
    
    return arr;


例题

#include<iostream> 
#include<cstdio> 
#include<algorithm> 
using namespace std; 
int main()

    int n,k,i,a[100001],b[100001],ans=0;
    scanf("%d%d",&n,&k);
    for(i=1;i<=n;i++)
    scanf("%d",&a[i]);
    sort(a+1,a+n+1);//sort从小到大排序 
    for(i=1;i<=n-1;i++)
    b[i]=a[i+1]-a[i];//算出各等级选手的差 
    sort(b+1,b+n);//sort从小到大排序 
    for(i=1;i<=k;i++)
    ans+=b[i];//找出前K个等级差的和 
    printf("%d",ans);//输出 
    return 0;

🎈归并排序

解析

归并排序主要思想是对整个序列的元素进行逐层折半分组,然后从最小分组开始比较排序,合并成一个大的分组,逐层进行,最终所有的元素都是有序的。
举例:将3.2.5.8.1.6这六个数从小到大排序
1.第一步:首先是逐层折半分组,两个一组一共分成三组。

2.第二步:然后是每组进行排序

3.第三步:然后再逐层合并,按照从小到大。

4.第四步:在进行排序合并

这里插入个动图便于大家理解

代码实现

function mergeSort(arr) 
    var len = arr.length;
    if (len < 2) 
        return arr;
    
    var middle = Math.floor(len / 2),
        left = arr.slice(0, middle),
        right = arr.slice(middle);
    return merge(mergeSort(left), mergeSort(right));

 
function merge(left, right) 
    var result = [];
 
    while (left.length>0 && right.length>0) 
        if (left[0] <= right[0]) 
            result.push(left.shift());
         else 
            result.push(right.shift());
        
    
 
    while (left.length)
        result.push(left.shift());
 
    while (right.length)
        result.push(right.shift());
 
    return result;


例题

#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
using namespace std;
string s;
map<string,int>nmsl;
int n;
long long ans=0;
int c[1000001],d[1000001];
void qsort(int a,int b)
	
    if(a==b)return;
	int mid=(a+b)>>1;
	int i=a,j=mid+1,k=a;
    qsort(a,mid),qsort(mid+1,b);
    while(i<=mid&&j<=b)
	if(c[i]<=c[j])
	  
	  	d[k++]=c[i++];
	  
	else 
	  
	  	d[k++]=c[j++];
	  	ans+=mid-i+1;
	  
	while(i<=mid)
	  	d[k++]=c[i++];
	while(j<=b)
	    d[k++]=c[j++];
	for(int l=a;l<=b;l++)
	    c[l]=d[l];

int main()

	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	   
	   	cin>>s;
	   	nmsl[s]=i;
	   
	int j=0;
	for(int i=1保姆级教程html两万字笔记大总结建议收藏(上篇)(代码片段)

❤️HTML必备知识详解❤️第一部分:HTML框架简介1.是什么&怎么学&用什么工具(1)什么是HTML?(2)怎么学HTML?(3)使用的工具:2.HTML的基本结构3.HTML文件的规范4.HTML的基本模板第二... 查看详情

保姆级教程css两万字笔记大总结建议收藏(上篇)(代码片段)

❤️CSS必备知识详解❤️第一部分:CSS的基本使用(1)CSS是什么?(2)CSS写在哪里?(3)CSS的三大引入方式:1.直接写在标签内(直接在标签内设置)小知识点:2.写在style标签... 查看详情

❤️通宵爆肝两万字xpath教程+实战练习❤️(代码片段)

文章目录一、必看内容!!!1)简短介绍2)必备知识3)为什么我要写这篇文章?4)强烈推荐教程专栏二、开始使用xpath2.1常见的HTML操作2.2常见XML操作2.2.1选择一个元素2.2.2选择文字2.3浏览器使用xpa... 查看详情

java基础语法爆肝两万字解析java的多态抽象类和接口(代码片段)

文章目录一、多态1.向上转型2.动态绑定3.方法重写4.向下转型5.关键字super6.在构造方法中调用重写方法(坑)7.理解多态8.小结二、抽象类1.概念2.注意事项3.抽象类的意义3.抽象类的作用三、接口1.语法规则2.实现多个接口3.... 查看详情

javascript保姆级教程———重难点详细解析(万字长文,建议收藏)(代码片段)

JavaScript保姆级教程———重难点详细解析(建议收藏)1.JS函数2.JS事件3.JavaScript对象4.JavaScriptprototype(原型对象)5.call和apply及bind三者的区别(面试重点)6.Javascript的事件流模型(面试重点)7.防抖... 查看详情

《爆肝整理》保姆级系列教程-玩转charles抓包神器教程-charles安卓手机抓包大揭秘

1.简介Charles和Fiddler一样不但能截获各种浏览器发出的HTTP请求,也可以截获各种智能手机发出的HTTP/HTTPS请求。Charles也能截获Android和WindowsPhone等设备发出的HTTP/HTTPS请求。今天宏哥讲解和分享Charles如何截获安卓移动端发出的HTTP/HTT... 查看详情

《爆肝整理》保姆级系列教程-玩转charles抓包神器教程(15)-charles如何配置反向代理

1.简介在App开发的过程当中,抓包是一个很常见的需求,而有些app的请求不会在网络设置代理时被抓到数据包,这里若是需要抓包就需要搭建反向代理。2.什么是代理?什么是代理,来一张图了解一下。 代理又分为正向代理... 查看详情

两万字解析aiot智能物联网工程师学习路线,c站最全路线谁赞成谁反对?

...线培养目标职业规划目标一、Python 基础与科学计算二、算法数学基础三、线性回归算法四、线性回归分类算法 五、无监督学习算法六、决策树系列算法七、Kaggle实战八、概率图模型算法九、Linux基础 查看详情

《爆肝整理》保姆级系列教程-玩转charles抓包神器教程(10)-charles如何修改请求参数和响应数据-下篇

《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(10)-Charles如何修改请求参数和响应数据-下篇1.简介宏哥之前一直用postman调接口比较多(web端),也非常容易上手和操作。但有时候想要去修改APP的页面展示,造数据又会比较... 查看详情

三万字|kafka知识体系保姆级教程宝典(代码片段)

本文目录:中的数据,然后转成大写,将结果写入test2。第三步:生产数据node01执行以下命令,向test这个topic当中生产数据:bin/kafka-console-producer.sh --broker-list node01:9092,node02:9092,node03:9092 --topic test第四步:消费数据no... 查看详情

动画图解:十大经典排序算法动画与解析,看我就够了!(配代码完全版)(代码片段)

 排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序。内部排序是数据记录在内存中进行排序。而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需... 查看详情

[数据结构]——线性表总结(c语言代码实现)爆肝两万字!(代码片段)

线性表总结文章目录线性表总结一,顺序表1,头文件2,C文件3,测试菜单文件(menu)4,顺序表的优缺点二,单链表1,头文件2,C文件3,测试文件4,带头链表和不带头链表三,... 查看详情

50000字,数仓建设保姆级教程,离线和实时一网打尽(理论+实战)下(代码片段)

本文大纲:因内容较多,本文将直接从第五章开始,完整版文档请点击下方链接:数仓建设保姆级教程完整版文档https://mp.weixin.qq.com/s?__biz=Mzg2MzU2MDYzOA==&mid=2247491812&idx=1&sn=cd20944f96ce 查看详情

「3.4w字」超保姆级教程带你实现promise的核心功能(代码片段)

保姆级详解promise的核心功能📚序言📋文章内容抢先看📰一、js的同步模式和异步模式1.单线程💡2.同步模式💡(1)定义(2)图例3.异步模式💡(1)举例(2)定义(3 查看详情

☀️~爆肝万字总结递归~❤️玩转算法系列之我如何才能掌握递归解题的能力❤️~十大经典问题助你突破极限~☀️(代码片段)

🍅作者主页:Roninaxious🍅欢迎点赞👍收藏⭐留言📝🚢前言🎐何为递归递归顾名思义就是´递´和´归´👀所谓的‘递’也就是“向下递去”,这个问题可以分解为若干个且形式相同的子问题... 查看详情

yolov1代码分析——pytorch版保姆级教程(代码片段)

...ff0c;以及R-CNN,FastR-CNN,FasterR-CNN,SSD目标检测算法的理论部分,有不懂的小伙伴可以回到前面看看,下面附上链接:目标检测实战篇1——数据集介绍(PASCALVOC,MSCOCO)YOLOv1目标检测算法——通俗易懂的解... 查看详情

✨✨[数据结构]——最经典的七大排序(超详细近两万字教程,你值得拥有)✨✨(代码片段)

文章目录一,插入排序1,直接插入排序(1)基本思想(2)主要步骤(3)代码实现(4)性能分析2,希尔排序(1)基本思想(2)主要步骤(3)代码实现(4)性能分析二,选择排序1,直接选... 查看详情

爆肝了13万字后,又录了169集配套保姆级c语言视频!(建议收藏)

极客江南:一个对开发技术特别执着的程序员,对移动开发有着独到的见解和深入的研究,有着多年的iOS、Android、HTML5开发经验,对NativeApp、HybridApp、WebApp开发有着独到的见解和深入的研究,除此之外还精通JavaScrip... 查看详情