JavaScript学习笔记 - 基础排序算法

 2023-09-05 阅读 251 评论 0

摘要:本文记录了我在学习前端上的笔记,方便以后的复习和巩固。推荐大家去看看这一本gitBook上的书十大经典排序算法本文就是看这本书记录的笔记。 冒泡排序 1.算法步骤 1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。2.对每一对相邻元素作同样的工作

本文记录了我在学习前端上的笔记,方便以后的复习和巩固。
推荐大家去看看这一本gitBook上的书十大经典排序算法本文就是看这本书记录的笔记。

冒泡排序

1.算法步骤

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

2.图片演示:

clipboard.png

代码实现:

//数组内两个值互换
function swap(arr, index1, index2) {var temp = arr[index1];arr[index1] = arr[index2];arr[index2] = temp;
}
function bubbleSort(arr){var len = arr.length,i,j;for(i = 0; i < len - 1; i++){    //进行len-1趟选择(循环),第一趟循环会选出最i个最大记录//因为i循环已经拿到了最后的数值,i循环一次拿到一次最大的数值所以减i,i = 已被排序好的数值数量for(j = 0; j < len - 1 - i;){//比较相邻的数值,如果第一个比第二个大就交换他们。 交换到最后最大数值排在数组最后if(arr[j] > arr[j+1]){swap(arr , j, j+1);}}}return arr;
}

详解

依次比较相邻的两个元素,如果后一个小于前一个,则交换,这样从头到尾一次(外循环一次)就将最大的数放在了数组末尾。

从头到尾再来一次(外循环),由于每进行一轮,最后的都已经是最大的了,因此后一轮需要比较(内循环)的次数可以比上一次少一个(i个)。虽然你还是可以让他从头到尾来比较,但是后面比较都是没有意义的,为了效率,你应该对代码进行优化。

选择排序

1.算法步骤

1.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
2.再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
3.重复第二步,直到所有元素均排序完毕。

2.动图演示

clipboard.png

function selectionSort(arr){var len = arr.length;var index,temp;for(var i = 0; i < arr.length - 1; i++){ //进行len - 1趟选择(循环),选择第i个最小记录。var index = i;//因为i循环已经拿了最前面的数值 所以j循环复制拿后面的数值和进行对比。for(var j = i + 1; j < arr.length; j++){if(arr[j] < arr[index]){ //第一次循环次数的min = 1index = j;  //将最小数的索引保存,选择第i个小记录的下标赋值给min,arr[min]为最小数值}}if(j != index){   //与第i个小记录交换  i和min相同代表已经排序完毕swap(arr, i, index);}}return arr;
}

示例:假设给定数组A[1......6]={ 3,5,8,9,1,2 },我们来分析一下A数组进行选择排序的过程

    第一趟:i=1,index=5, a[1] 和 a[5] 进行交换。得到序列:{ 1,5,8,9,3,2 }第二趟:i=2,index=6, a[2] 和 a[6] 进行交换。得到序列:{ 1,2,8,9,3,5 }第三趟:i=3,index=5, a[3] 和 a[5] 进行交换。得到序列:{ 1,2,3,9,8,5 }第四趟:i=4,index=6, a[3] 和 a[5] 进行交换。得到序列:{ 1,2,3,5,8,9 }第五趟:i=5,index=5, 不用交换。得到序列:{ 1,2,3,5,8,9 }(6-1)趟选择结束,得到有序序列:{ 1,2,3,5,8,9 }

插入排序

1.步骤

1.将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。

2.从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

2.动图演示

clipboard.png

function insertionSort(arr) {var len = arr.length;var value;//循环len趟,外层循环顺序是从数组的第一位到最后一位for(var i = 1; i < len; i++){value = arr[i]; //每趟循环拿到第i的数值赋值给Value//内层顺序是从后往前 j = i - 1会跳过已经排好序的部分。比较后面的数值是否大于前面的数值for(var j = i - 1; j > -1 && arr[j] > value; j--){ arr[j+1] = arr[j]    //满足条件直接交换}//因为前面已经排好序直接给value赋值排好序的最后一个arr[j+1] = value;}
}

代码块中的注释只是自己的理解,如果有错误请指正,多谢各位了

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/763.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息