基本排序算法

十大基本排序算法的简易可视化 本文利用Microsoft Visual Studio的C语言编写平台及其自带的输出窗口尝试制作了十种基本排序算法的简单可视化。最终的输出都是文字、数字与符号,笔者已经尽力调整其位置以让结果尽可能清楚。本来是自己在学习排序算法的时候希望可以看到输入的数据在计算机内部被操作的过程,这样方便理解,同时又想用尽可能简单(懒)的方式实现,所以做了这些尝试。相比于网上的动画式可视化工具,本方法在视觉效果上略逊一筹。 阅读详情

插入排序

算法描述:
1. 从第一个元素开始,该元素可以认为已经被排序
2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
4. 重复步骤 3,直到找到已排序的元素小于或者等于新元素的位置
5. 将新元素插入到该位置后
6. 重复步骤 2~5

现有一组数组 arr = [5, 6, 3, 1, 8, 7, 2, 4]

[5] 6 3 1 8 7 2 4  //第一个元素被认为已经被排序

[5,6]  3 1 8 7 2 4 //6与5比较,放在5的右边

[3,5,6]  1 8 7 2 4 //3与6和5比较,都小,则放入数组头部

[1,3,5,6]   8 7 2 4 //1与3,5,6比较,则放入头部

[1,3,5,6,8]   7 2 4

[1,3,5,6,7,8]  2 4

[1,2,3,5,6,7,8] 4

[1,2,3,4,5,6,7,8] 

编程思路:双层循环,外循环控制未排序的元素,内循环控制已排序的元素,将未排序元素设为标杆,与已排序的元素进行比较,小于则交换位置,大于则位置不动

function insertSort(arr){
    var tmp;
    for(var i=1;i<arr.length;i++){
        tmp  = arr[i];
        for(var j=i;j>=0;j--){
            if(arr[j-1]>tmp){
                arr[j]=arr[j-1];
            }else{
                arr[j]=tmp;
                break;
            }
        }
    }
    returan arr
}
//时间复杂度O(n^2)

选择排序

算法描述:直接从待排序数组中选择一个最小(或最大)数字,放入新数组中。

[1] 5 6 3 8 7 2 4 

[1,2] 5 6 3 8 7 4 

[1,2,3] 5 6 8 7 4 

[1,2,3,4] 5 6 8 7

[1,2,3,4,5] 6 8 7 

[1,2,3,4,5,6] 8 7  

[1,2,3,4,5,6,7] 8

[1,2,3,4,5,6,7,8] 

编程思路:先假设第一个元素为最小的,然后通过循环找出最小元素,然后同第一个元素交换,接着假设第二个元素,重复上述操作即可

function selectSort(arr){
    for(var i=0;i<arr.length;i++){
        for(var j=i+1;j<arr.length;j++){
            if(arr[i]>arr[j]){
                minIndex=j;
                minValue=arr[j]
            }
        }
        var tmp=minValue;
        arr[minIndex]=arr[i];
        arr[i]=tmp;
    }
    return arr
}
//时间复杂度O(n^2)

归并排序

算法描述:
1. 把 n 个记录看成 n 个长度为 l 的有序子表
2. 进行两两归并使记录关键字有序,得到 n/2 个长度为 2 的有序子表
3. 重复第 2 步直到所有记录归并成一个长度为 n 的有序表为止。

5 6 3 1 8 7 2 4

[5,6] [3,1] [8,7] [2,4]

[5,6] [1,3] [7,8] [2,4]

[5,6,1,3] [7,8,2,4]

[1,3,5,6] [2,4,7,8]

[1,2,3,4,5,6,7,8]

编程思路:将数组一直等分,然后合并

function merge(left,right){
    var tmp=[];
    while(left.length && right.length){
        if(left[0]<right[0]){
            tmp.push(left.shift());
        }else{
            tmp.push(right.shift());
        }
    }
    return tmp.concat(left,right)
}
function mergeSort(arr){
    if(arr.length==1) return arr;
    var mid=Math.floor(a.length/2),
        left=arr.slice(0,mid);
        right=arr.slice(mid);
    return merge(mergeSort(left),mergeSort(right))
}
//时间复杂度O(nlogn)

快速排序
算法描述:

  1. 在数据集之中,选择一个元素作为”基准”(pivot)。
  2. 所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。这个操作称为分区 (partition)操作,分区操作结束后,基准元素所处的位置就是最终排序后它的位置。
  3. 对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

    5 6 3 1 8 7 2 4
    
    pivot
    |
    5 6 3 1 9 7 2 4
    |
    storeIndex
    
    5 6 3 1 9 7 2 4//将5同6比较,大于则不更换
    |
    storeIndex
    
    3 6 5 1 9 7 2 4//将5同3比较,小于则更换
      |
      storeIndex
    
    3 6 1 5 9 7 2 4//将5同1比较,小于则不更换
        |
       storeIndex
    ...
    
    3 6 1 4 9 7 2 5//将5同4比较,小于则更换
          |
          storeIndex
    
    3 6 1 4 5 7 2 9//将标准元素放到正确位置
          |
    storeIndex pivot
    
function quickSort(arr){
    if(arr.length<=1) return arr;
    var partitionIndex=Math.floor(arr.length/2);
    var tmp=arr[partitionIndex];
    var left=[];
    var right=[];
    for(var i=0;i<arr.length;i++){
        if(arr[i]<tmp){
            left.push(arr[i])
        }else{
            right.push(arr[i])
        }
    }
    return quickSort(left).concat([tmp],quickSort(right))
}
//时间复杂度O(nlogn)

冒泡排序
算法描述:
1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3. 针对所有的元素重复以上的步骤,除了最后一个。
4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

5 6 3 1 8 7 2 4

[5 6] 3 1 8 7 2 4 //比较5和6

5 [6 3] 1 8 7 2 4

5 3 [6 1] 8 7 2 4

5 3 1 [6 8] 7 2 4

5 3 1 6 [8 7] 2 4

5 3 1 6 7 [8 2] 4

5 3 1 6 7 2 [8 4]

5 3 1 6 7 2 4 8  // 这样最后一个元素已经在正确位置,所以下一次开始时候就不需要再比较最后一个

编程思路:外循环控制需要比较的元素,比如第一次排序后,最后一个元素就不需要比较了,内循环则负责两两元素比较,将元素放到正确位置上

function bubbleSort(arr){
    var len=arr.length;
    for(var i=len-1;i>0;i--){
        for(var j=0;j<i;j++){
            if(arr[j]<arr[j+1]){
                var tmp = arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=tmp
            }
        }
    }
    return arr;
}
//时间复杂度O(n^2)
十种基本排序算法 十种基本排序算法 代码自己慢慢找哈 #define _CRT_SECURE_NO_WARNINGS #include<Windows.h> #include<stdio.h> #define MaxSize 10//归并排序,桶排序等排序时需要申请和原数组一样大小的空间时用到,方便修改 //快排 int QuickShortchild(int *str, int lef... 阅读详情

相关推荐

Vlan的封装模式和端口讲解(Access、Trunk、Hypbrid端口)

Vlan(Virtual Local Area Network)虚拟局域网,将一个物理的LAN在逻辑上划分为多个广播域,在交换机上实现广播域隔离(增强局域网的安全性、限制广播风暴、简化网络管理)Vlan通过将二层数据帧打上Vlan标签(打上Vlan标签也就是封装Vlan),正常情况下,不同Vlan Tag的数据包是无法二层直接互访的,以此来实现广播域的隔离可以理解为一个Vlan对应一个广播域,同一Vlan内的主机可以二层直接通信,不同Vlan间的主机无法二层直接通信。

m0_49864110的博客 5649

对链表进行插入排序。从第一个元素开始,该链表可以被认为已经部分排序。每次迭代时,从输入数据中移除一个元素,并原地将其插入到已排好序的链表中。

力扣原题: 先贴代码: public class Solution147 { public ListNode insertionSortList(ListNode head) { //当链表为空时,不需排序,直接返回 if (head == null){ return head; } //创建一个虚拟头节点,方便处理头节点 ListNode newhead = new ListNode(

小型骷髅的博客 409

Windows版本Carla(含RoadRunner插件)源码安装+RoadRunner地图导入

通过跳转浏览器账号密码登录github,不要选择Fine-grained personal access tokens,在git clone时会显示非授权,也不要使用Windows凭据!核心指令:编译PythonAPI–make PythonAPI,,编译Server–make launch,封装”游戏“–make package。完成安装后,在已安装->2022版本右侧->更多->导入配置,选择配置文件(需将配置文件内容更新为手册内容,如下图)->详细信息,更新。不要修改版本,执行上面指令即可!

winnizap的博客 1470

插入排序

简介 Insertion Sort 和打扑克牌时,从牌桌上逐一拿起扑克牌,在手上排序的过程相同。 举例: Input: {5 2 4 6 1 3}。 首先拿起第一张牌, 手上有 {5}。 拿起第二张牌 2, 把 2 insert 到手上的牌 {5}, 得到 {2 5}。 拿起第三张牌 4, 把 4 insert 到手上的牌 {2 5}, 得到 {2 4 5}。 以此类推。 算法 从第一个元素开始...

alias 304

HA集群 执行 hdfs haadmin -transitionToActive 失败

最近把一个单NameNode集群变更为HA集群,过程中都很顺利,nn1和nn2两个NameNode都显示standby状态,但是把nn1或者nn2切换到active状态时就会报错抛异常。 查看master上namenode启动日志,如下: Incompatible clusterID for journal Storage Directory /home/hadoop-zero/bigdat...

qq_34727158的博客 1764

全志V3S嵌入式驱动开发(解决kernel 5.2.y wifi驱动问题)

​【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 wifi模块,之前测试的时候,开发板上用的是esp8089,当时内核时4.14.y,测试也是通过的。链接地址在这里, https://blog.youkuaiyun.com/feixiaoxing/article/details/131178420?spm=1001.2014.3001.5501 那个时候测试的时候,我们就说过,wifi驱动可能是除了镜像制作之外,最复杂的一个

嵌入式-老费,一个分享专业嵌入式知识的blog 1160

排序算法1

排序算法 1. 冒泡排序 1.1 定义 冒泡排序,是比较简单的一种排序算法。 它的命名源于它的算法原理:重复的从前往后(或者从后往前),依次比较记录中相邻的两个元素,如果他们顺序错误就把它们交换过来,直到没有再需要交换的元素,就说明该记录已完成排序。 它看起来就像是把最大的元素(或最小的元素)经由交换慢慢的‘浮’到数列的顶端,故名冒泡排序。 1.2 算法步骤 比较相邻元素,如果第一个比第二个大,就交换它们两个。(升序排序为例) 对每一组相邻元素做同样的工作,从开始到最后一对,这时最后的元素应该会是最大

小白猿同学 231

Python爬虫深度对抗:拼多多与得物价格监控系统中的设备指纹模拟与SkyWalking风控绕过实战

在电商数据采集领域,拼多多和得物(毒)APP堪称国产风控系统的“双子星”。前者依托于拼多多集团强大的安全团队,后者则以其独特的“潮流单品”数据价值和高昂的爬取成本闻名。对于任何一名爬虫工程师而言,能够稳定、高效地获取这两大平台的价格、库存、销量等动态信息,都是一项极具挑战性的技术试金石。传统的基于requests库的简单HTTP请求,在面对这两款应用时几乎寸步难行。你会发现,无论怎样伪造User-Agent、怎样轮换代理IP,返回的永远是状态码412403,或者是一个包含验证滑块设备异常的JSON错误。

2201_76125261的博客 866

LeetCode---排序

经典排序算法 1. 冒泡排序 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 1.1 算法描述 比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数; 针对所有的元素重复以上的步骤,除了最后一个; 重复步骤

weixin_43571751的博客 251

SIMATIC WINCC V8.0安装教程(Win11系统)

SIMATIC WINCC V8.0安装教程(Win11系统)

Robot_PLC_HMI_Automation 9057

基于STM32L4XX 、HAL库的ATD5984步进电机驱动器驱动程序应用设计

一、简介: ATD5984是一款内部集成了译码器的微特步进电机 驱动器,能使双极步进电机以全、半、1/4、/1/8、1/16 和1/32步进模式工作。步进模式由逻辑输入管脚MSx选 择。其输出驱动能力达到28V±1.6A。 译码器是ATD5984易于使用的关键,通过STEP管脚 输入一个脉冲就可以使电机完成一次步进,省去了相序 表,高频控制线及复杂的编程接口,使其更适于没有复 杂的微处理器或微处理器负担过重的场合。 在步进操作期间,ATD5984的内部电路可以自动

PP_Cottage的博客 410

搞懂基本排序算法

搞懂基本排序算法 上篇文章写了关于 Java 内部类的基本知识,感兴趣的朋友可以去看一下:搞懂 JAVA 内部类;本文写的内容是最近学习的算法相关知识中的基本排序算法,排序算法也算是面试中的常客了,实际上也是算法中最基本的知识。由于 Android 开发中用到的地方并不多,所以也很容易遗忘,但是为了进阶高级工程师巩固基本算法和数据结构也是必修课程之一。 基本排序算法按难易程度来说可以分...

王小六的博客 786

农业无人机:无人机图像处理_(8).遥感图像处理与分析

遥感图像处理与分析在农业无人机技术中具有重要作用,通过图像预处理、特征提取、分类与分割、目标检测等技术,可以实现对农田的精细管理、作物监测、病虫害预测等应用。本节详细介绍了这些技术的基本概念、常用方法和具体实现,希望对您在农业无人机图像处理方面的学习和应用有所帮助。

zhubeibei168的博客 1338

基本排序算法总结

排序算法总结冒泡排序选择排序插入排序归并排序快速排序希尔排序基数排序计数排序桶排序Tim排序 冒泡排序 冒泡算法是基于比较的排序算法,排序思想:当前元素比下一个元素大(或小)的时候,就与之进行交换。 void BubbleSort(vector<int> &nums) { for(int i=0;i<nums.size()-1;i++) { for(int j=0;j<nums.size()-i-1;j++) { if(nums[j]>nums[j+1

weixin_42168958的博客 223

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

基本排序算法小结

一、插入排序 1  排序思想     将待排序的记录Ri,插入到已排好序的记录表R1, R2 ,…., Ri-1中,得到一个新的、记录数增加1的有序表。 直到所有的记录都插入完为止。复杂度为O(n2) 。     设待排序的记录顺序存放在数组R[1…n]中,在排序的某一时刻,将记录序列分成两部分: ◆ R[1…i-1]:已排好序的有序部分; ◆ R[i…n]:未排好序的无序部分。

肖氏专栏 2159

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

基本的排序算法

基本的排序算法 Java实现各种基本的排序算法 冒泡排序 冒泡排序:这种排序方法是通过相邻的两个元素两两比较,根据大小来交换位置,最值元素就像气泡一样从左侧向右侧移动,故名冒泡排序。 public class BubbleSort { public static void main(String[] args) { int []a= {9,3,1,4,6,8,7,5,2}; sort(a); print(a); } //冒泡排序 static void sort(int[] a)

weixin_43731014的博客 303

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

三个基本排序算法

1选择排序 1.1过程分析 对于一个不确定的整形数组,首先将i=0所在的数和后面的所有数进行比较,找出最小的数i=j交换数组中的数,下一次再从i=1开始比较,直到i=num.length-1 1.2动画分析 1.2算法描述 public class selectsort { public static void main(String[] args) { int[] num= {2,3,5,4,1,9,8,7};//要排序的数组 T1(num); for(int n:num) //增强型f

正在自我救赎的菜鸟。本人所有内容均不收费,可随意转发,复制 1192

PHP基本排序算法

基本排序算法 bubblesort 冒泡排序 insertsort 插入排序 shellsort 希尔排序 selectsort 简单查找排序 quicksort 快速排序 &lt;?php /* * bubble的原理:数组的前两个数字对比 * 每次数字大的后移一位 * 如果数字的长度是10 需要最多排序9次 */ function bubbleSort(array $numbe...

Aspire 200

排序算法之基本几种排序方法

排序算法 什么是排序算法 基本都排序算法有哪些 怎么衡量排序算法的优劣 冒泡排序的思想与c语言代码 插入排序的思想与c语言代码 1.什么是排序算法。 当你有一堆数据的时候,看着他们杂乱无章,无序的时候是不是看着特别不爽。是不是特想看着它们是从小到大,或者从大到小排列的,看着就舒服多了。还有哦,排序可不止是让你看着舒服,还有一部分是查找。在一堆数据中查找是否存在一个数据,如果是一堆杂乱无章的数据,我们就只能一个个比较,是否是你要的那个数据,...

m0_57614828的博客 2089

排序算法基本思想

 转自:http://yijiaotest.rdedu.net/yijiaotest/web/200552432039930/app/readnews.asp?id=8一、插入排序(Insertion Sort)1. 基本思想:  每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。2. 排序过程: 【示例】:[初始关键字] [

Day day up! 1524

三种基本排序算法

三种基本排序排序算法 1.冒泡排序 基本原理: {3,5,4,2,6,1} 比较前两个元素{【3,5】,4,2,6,1} 3&amp;lt;5 保持不变 {3,[5,4],2,6,1} {3,4,[5,2],6,1} {3,4,2,[5,6],1} {3,4,2,5,[6,1]} {3,4,2,5,1,6} 第一遍排序完成,进行下一次排序,依次类推 由于最后一个元素已经是最大的...

weixin_42481455的博客 532
上一篇: 前几天遇到的笔试题
下一篇: 知识点汇总
ruby_xc
博客等级 码龄10年 10粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值