排序算法

来自:    更新日期:早些时候
~ 排序算法(上)

算法里面最简单的就是排序算法,这节课主要讲选择排序。\算法入门:四种排序算法(选择、归并、快速、技术)和对应的结构。

实现minOf2:2个数找出较小的那个

再优化

析构赋值:把结构拆开,依次复制let?minOf2=([a,b])?=>?a?<?b???a?:?b?//调用minOf2([1,2])?//小白调用法minOf2.call(null,[1,2])?//高手调用法

现成API\JS内置了Math.min\Math.min(1,2)\Math.min.call(null,1,2)\Math.min.apply(null,[1,2])\关于Math\看起来Math像Object一样是构造函数\实际上Math只是普通对象,唯一一个首字母大写的对象,对象一般首字母小写

实现minOf3:3个数找出最小的那个

推广,任意长度数组求最小值

递归\特点\函数不停调用自己,每次调用的参数略有不同\当满足某个简单条件时,则实现一个简单的调用\最终算出结果\理解\可以用代入法快速理解递归\可以用调用栈快速理解递归

解析代入法,先递进后回归

知识点\1.numbers.slice(1)选中从下标1开始的所有数据\2.Math.min.apply(null,numbers)\apply就是把numbers一个个展开调用。call就是把numbers作为一项。

var?arr?=?[1,3,6,8,2,10];var?minNum?=?Math.min.apply(null,arr);console.log(minNum);??//1

Math.min可以实现得到数组中最小的一项\Math.min.apply(null,arr)其中第一个参数null,这个是因为没有对象去调用这个方法,所以直接传递null过去。同理,Math.max.apply可以获得数组里面最大的值。

实现sort排序(将正整数数组从小到大排序)

排序算法\思路:1'用递归实现、2'用循环实现

递归思路

选择排序\例1.将长度为2的数组排序

例2.将长度为3的数组排序\思路:先求最小值,把最小值放前面。\然后将后面2个数字进行"2个数的排序"。

let?minIndex?=?(numbers)?=>?numbers.indexOf(min(numbers))?//取巧:如果有2个最小数,只会返回第1个最小数的下标。let?sort3?=?(numbers)?=>?{//获取最小数字的下标??let?index?=?minIndex(numbers)?//minIndex函数??let?min?=?numbers[index]//获取最小数下标后再将其删掉,返回被保留的数字??numbers.splice(index,?1)???return?[min].concat(sort2(numders))}

知识点\1.JS中concat用于2个数组的相加,拼成一个数组\2.sort2(numders)得到的是排好序的2个数\3.numbers.indexOf求出某个数字的下标

例3.将长度为4的数组排序

推广,任意长度的数组排序\死循环,到2个数时不会断。

要理解递归,必须用代入法

选择排序:每次找到最小的数放前面,然后对后面的数做同样的事情。

例子:假设我没理解splice,于是我写了rest,实际上splice会返回被删除部分而不是被余下部分。

let?minIndex?=?(numbers)?=>?numbers.indexOf(min(numbers))?let?sort?=?(numbers)?=>?{??if(numbers.length>2){????let?index?=?minIndex(numbers)?????let?min?=?numbers[index]????let?rest=numbers.splice(index,1)????return?[min].concat(sort(rest))??}else{??????return?numbers[0]<numbers[1]?numbers:numbers.reverse()??}}

分析报错\当前代码属于匿名的函数,调用了sort,sort调用了minIndex,minIndex调用了min,并发现min不存在。\这个就叫做调用栈,函数调了函数,前面的函数就要压到栈里面。\它说没有定义那就一定没有定义,找原因。\1.<anonymous>,当前代码属于匿名的函数\2.atsort,调用了sort

结果不符合预期,把每一步的结果打出来

推断出rest有问题那怎么拿到剩余的数呢?

总结\1.求最小值:2个数、3个数、N个数\2.排序:2个数、3个数、N个数\用到的东西:数组(数据结构)、递归\1.请写一个min函数,要求min(numbers)能返回数组numbers中的最小数字。

let?min?=?(numbers)?=>?{??if(numbers.length?>?2){????return?min([numbers[0],?min(numbers.slice(1))])??}else{????return?Math.min.apply(null,?numbers)??}}

2.请写出一个sort函数,要求sort(numbers)能返回一个把numbers从小到大排列的数组

let?minIndex?=?(numbers)?=>?numbers.indexOf(min(numbers))let?sort?=?(numbers)?=>?{??if(numbers.length?>?2){????let?index?=?minIndex(numbers)????let?min?=?numbers[index]????numbers.splice(index,?1)????return?[min].concat(sort(numbers))??}else{????return?numbers[0]<numbers[1]???numbers?:?numbers.reverse()??}}sort([21,8,44,92])

排序算法(下)

算法入门:四种排序算法和对应的结构。

所有算法都有2种写法递归和循环。\目前的minIndex,看着就繁琐。

let?minIndex?=?(numbers)?=>?numbers.indexOf(min(numbers))let?min?=?(numbers)?=>?{??return?min(?[numbers[0],?min(numbers.slice(1))]?)}

minIndex重写

let?minIndex?=?(numbers)?=>??let?index=0?//默认下标为0开始??for(let?i=1;i<numbers.length;i++){//默认从第2个开始比????if(numbers[i]<numbers[index]){??????index=i????}??}??return?index}

默认返回下标为0(默认第1个数是最小的数),然后用每个数跟它比。\哪个数字比它小就把下标置为那个小的数字。\所有递归都能改为循环

面试题\四种排序算法以及时间复杂度

改写sort:选择排序的循环写法

思路不变:\每次找到最小的数放前面,然后对后面的数做同样的的事情,然后i++。

let?sort?=?(numbers)?=>?{??if(numbers.length?>?2){????let?index?=?minIndex(numbers)????let?min?=?numbers[index]????numbers.splice(index,?1)????return?[min].concat(sort(numbers))??}else{????return?numbers[0]<numbers[1]???numbers?:?numbers.reverse()??}}

实现swap

let?swap?=?(array,?i,?j)?=>?{??let?temp?=?array[i]??array[i]?=?array[j]??array[j]?=?temp}swap(numbers,?1,?2)

思考1.错误地实现swap

思考2.怎么知道?处应该写什么\暴力分析

假设numbers的长度为n=4,推算出i最大为2。

重新分析代码

最终代码

var?arr?=?[1,3,6,8,2,10];var?minNum?=?Math.min.apply(null,arr);console.log(minNum);??//10

知识点\1.JSES6析构赋值实现交换ab值

var?arr?=?[1,3,6,8,2,10];var?minNum?=?Math.min.apply(null,arr);console.log(minNum);??//11

2.交换值lettemp=a;a=b;b=temp\3.JS删除数组中的某个元素默认返回的还是数组,要取数组的第[0]项

总结\所有递归都能改成循环。循环的时候有很多细节:\这些细节很难想清楚,要动手列出表格找规律,\尤其是边界条件很难确定,我们没有处理长度为0和1的数组。\学会debug

快速排序

递归思路\以某某为基准

8个人就要指定8次。\快速排序-阮一峰

归并排序

递归思路\不以某某为基准

merge的逻辑图

计数排序

整理扑克牌的过程就是计数排序\这就是哈希表:A有几个,2有几个,3有几个...

最终代码:当j出现两次时(当12出现了2次时,就push2次)

如果你的数据结构升级了,你的算法就会直接升级。\技术排序的特点\事件复杂度对比

其它排序算法\冒泡排序\插入排序\希尔排序\基数排序

原文:https://juejin.cn/post/7095686492164489229




排序算法视频

相关评论:
  • 17836721580稳定的排序算法有哪些
    张叔实稳定的排序算法:冒泡排序、插入排序、归并排序、基数排序、计数排序。1、冒泡排序:冒泡排序是一种基本的比较排序算法,它通过多次遍历数据来将较大的元素逐渐“冒泡”到数组的末尾。冒泡排序是稳定的,但在大型数据集上性能较差。2、插入排序:插入排序是一种简单的排序算法,它逐个将元素插入已排序的部分...

  • 17836721580数据结构-十大排序算法
    张叔实以下是关于数据结构中的十大排序算法的详细介绍:1. 插入排序直接插入排序:简单易懂,通过逐个元素插入已排序序列。C 代码示例...折半插入排序:改进版,利用二分查找法提高效率。C 代码示例...2. 希尔排序希尔排序:基于插入排序,通过逐步减小间隔实现高效排序。C 代码示例...3. 交换排序冒泡排序:...

  • 17836721580计算机算法有哪些
    张叔实1. 排序算法:排序算法是计算机中最基本且应用广泛的算法之一。包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。这些算法的主要目的是将一组数据按照特定的顺序(如升序或降序)重新排列。2. 搜索算法:搜索算法主要用于在数据结构中找到特定的信息。常见的搜索算法包括线性搜索、二分搜索、哈希表...

  • 17836721580计算机排序方法有哪些
    张叔实选择排序是一种简单直观的排序算法。它的工作原理是每次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。这种排序方式对于小规模数据或者部分有序的数据效率高。3. 插入排序(Insertion Sort)插入排序是一种简单直接的排序算法。它的工作原理是...

  • 17836721580大学要学会这8种算法程序员
    张叔实算法一: 快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n个项目要O(nlogn)次比较。在最坏状况下则需要O(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他O(nlogn)算法更快,因为它的内部循环 (innerloop)可以在大部分的架构上很有效率地被实现出来。

  • 17836721580编程的算法有哪些
    张叔实编程的算法多种多样,主要包括以下几种:1. 排序算法 排序算法是编程中非常基础和重要的一类算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序等。这些算法的主要目的是将一组数据按照特定的顺序(如从小到大或从大到小)进行排列。2. 搜索算法 搜索算法用于在数据结构(如数组、链表、树、图等...

  • 17836721580计算机有哪些算法
    张叔实1. 排序算法 排序算法是计算机中基础且重要的算法之一,包括快速排序、归并排序、冒泡排序、插入排序等。这些算法可以根据不同的数据结构和需求进行选择和调整,以实现数据的快速有序排列。2. 搜索算法 搜索算法用于在大量数据中查找特定信息。常见的搜索算法包括线性搜索、二分搜索、哈希表搜索等。这些算法...

  • 17836721580如何排序数组中两个数的大小?
    张叔实排序数组中两个数的大小,可以采用以下三种方法:1. 冒泡排序法:冒泡排序法是一种基础排序算法,通过比较相邻元素的大小来逐渐交换它们的位置,可以将最大或最小的元素移动到数组的末尾或开头。对于只有两个元素的数组,只需要进行一次比较和交换就可以确定它们的大小关系。2. 快速排序法:快速排序法是一...

  • 17836721580基于比较的排序算法
    张叔实基于比较的排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序。1、冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历待排序的元素,比较相邻的两个元素,如果它们的顺序错误,就交换它们的位置。这个过程会一直重复,直到没有需要交换的元素为止。冒泡排序的时间复杂度为O(n^2)...

  • 17836721580几种常见的排序算法及JavaScript实现
    张叔实选择排序是最容易理解的一种排序算法。1.1算法原理 遍历数据,把数据中的最大值(或者最小值)与起始(或者末尾)数据进行交换。1.2算法思路 1.从“待排序数据”中找到最小值。 2.把最小值和“待排序数据起止位置的元素”交换。 3.“待排序数据”的起始位置向后移动一位。 4.循环操作1~3,直至“待排序部分”只...

  • 相关主题精彩

    版权声明:本网站为非赢利性站点,内容来自于网络投稿和网络,若有相关事宜,请联系管理员

    Copyright © 喜物网