当前位置:网站首页>JS实现常见的六大排序
JS实现常见的六大排序
2022-04-22 17:12:00 【時間不夠以後】
1 冒泡排序
思想:让相邻的两个数一直作比较,直到完成排序。
时间复杂度:O( n² )
稳定度:稳定
代码实现:
var arr = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
for(var i =0 ; i < arr.length ; i++ ){
// i用来判断当前冒泡排序从位置几开始的
for(var j = 0 ; j < arr.length ; j++){
// j用来判断相邻两个数位置是否交换
if(arr[j] > arr[j+1]){
var temp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = temp
}
}
}

2 选择排序
思想:
- 假设第一个数为minNum,其下标为minIndex
- 用这个minNum和剩余的所有数比较,找出比第一个数还小的minNum,记录其minIndex;
- 然后将其找出的minNum的minIndex与第一个默认的minNum的minIndex做交换;
- 循环每个位置,直到完成排序
时间复杂度:O( n² )
稳定度:稳定
代码实现:
var brr= [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
var minIndex, temp
function selectionSort (arr) {
for(var i = 0 ; i < arr.length - 1 ; i++){
minIndex = i // 默认第一个数为minNum,并记录它的minIndex
for(var j = i + 1 ; j < arr.length ; j++){
if(arr[j] < arr[minIndex]){
// 如果arr[j] < 默认的minNum
minIndex = j // 记录这个新的minNum的minIndex
}
}
// 找到一趟下来的最小minNum及其minIndex,并交换位置
temp = arr[i]
arr[i] = arr[minIndex]
arr[minIndex] = temp
}
return arr
}
selectionSort(brr)

3 插入排序
思想:
- 从第二数开始,和前面已排好的序作比较,是否插入(>前 , <后)
时间复杂度:O( n² )
稳定性:稳定
// 直接比较前后的两个值
var brr = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
var temp
function insertSort (arr) {
for(var i = 1 ; i < arr.length ; i++){
// i用来判断当前循环做插入的是哪一个值的下标
for(j = i ; j - 1 >= 0 ; j--){
// j用来判断当前当前的值和前一个值,是否做交换
if(arr[j] < arr[j-1]){
// 如果当前值小于前一个值,则进行交换
temp = arr[j]
arr[j] = arr[j-1]
arr[j-1] = temp
}
}
}
return arr
}
insertSort(brr)
或者:
// 利用下标比较值
var brr = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
var temp,curIndex
function insertSort (arr) {
for(var i = 1 ; i < arr.length ; i++){
curIndex = i // 当前插入的值下标为i
for(j = i - 1 ; j >= 0 ; j--){
if(arr[curIndex] < arr[j]){
// 如果当前值小于它前面的值,则需要做交换
temp = arr[j]
arr[j] = arr[curIndex]
arr[curIndex] = temp
curIndex = j // 当两个值交换之后,当前做插入的这个值下标也随之改变成前一个
}
}
}
return arr
}
console.log(insertSort(brr))

4 快速排序
思想:
- 取到mid = arr.length / 2的中间值
- 将数组分为左右两个数组,以及取出来的中间值mid(splice方法)
- 分别对左右数组进行递归排序
- 将左右数组的递归跟中间值用concat函数返回
时间复杂度:O( nlogn )
稳定性:不稳定
var brr = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
function quickSort (arr) {
if(arr.length < 1){
return arr
}
var left = []
var right = []
var index = Math.floor(arr.length / 2)
var midNum = arr.splice(index, 1)[0]
for(var i = 0 ; i < arr.length ; i++){
if (arr[i] < midNum) {
left.push(arr[i])
} else{
right.push(arr[i])
}
}
return quickSort(left).concat(midNum, quickSort(right))
}
console.log(quickSort(brr))

5 归并排序(二叉树排序)
思想:分治法。
- mid=arr.lengt/2,得到数组分割的中间值
- 将给定的数组从mid分为左右两个数组,只有在分之后数组的length<2时,才停止分配。
- 对分配的<2的数组进行merge(),最后会得到左右两个有序的数组。
- 在对左右两个有序的数组进行merge(),取地址为0的数进行比较,最终返回排序。
时间复杂度:O( nlogn )
稳定性:不稳定
var brr = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
function mergeSort(arr) {
var len = arr.length
if (len < 2) {
return arr // 分为1
}
// 取出mid, (0,mid)的数组left, (mid,end)的数组right
var mid = Math.floor(len / 2),
left = arr.slice(0, mid),
right = arr.slice(mid)
// 和,将左右分割为1的数据进行合并
return merge(mergeSort(left), mergeSort(right))
}
function merge(left, right) {
// 定义一个返回的数组,初始为[]
var result = []
// 如果左右都存在
while (left.lenght && right.length){
// 取出[0]位置的左右数组的值进行比较
if(left[0] <= right[0]){
// 移除left[0],并push到result中
result.push(left.shift())
} else {
// 移除right[0],并push到result中
result.push(right.shift())
}
}
// 由于上面的while执行的时候,只执行了if的一个条件,另外一个数组则没有push到result中
while(left.length) {
result.push(left.shift())
}
while(right.length) {
result.push(right.shift())
}
return result
}
console.log(mergeSort(brr))

归并排序图解

6 堆排序
思想:
- 构建大顶堆。
- 将堆的最后一个元素与堆顶做交换。
时间复杂度:O( nlogn )
稳定性:不稳定
function heapSort (arr) {
for (var i = arr.length - 1 ; i > 0; i--) {
// 1.建立大顶堆
heapify(arr, i)
// 2. 最后一个子节点跟第一元素交换
swap(arr, 0, i)
}
return arr
}
function swap (arr, n, m) {
var temp = arr[n]
arr[n] = arr[m]
arr[m] = temp
}
function heapify(arr, n) {
// 先找出最后一个父节点
for (let i = Math.floor((n-1) / 2); i >= 0; i--) {
// 然后找出这个父节点的左孩子child
var child = 2 * i + 1
// 判断这个父节点是否存在右孩子,若右孩子存在,且 右孩子的值 > 左孩子的值 ,则child++
if (child != n && arr[child] < arr[child+1]) {
child++
}
// 最后,判断这个arr[child]和父节点的值,是否做交换,执行swap函数
if (arr[child] > arr[i]) {
swap(arr, child, i)
}
}
}
var brr = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
console.log(heapSort(brr))

版权声明
本文为[時間不夠以後]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_43972213/article/details/104577219
边栏推荐
- [deep learning] hands on learning pytorch version
- OJ daily practice -- find the sum of score sequences
- 關於閉包的7道面試題
- 华为走在老路上
- 2022年环境影响评价工程师考试相关法律法规练习题及答案
- 400 million women just need, all kinds of capital kill: 100 billion business hidden in sanitary napkins
- 15 ContentProvider
- 20220421 hardware imaging
- ES6 Proxy和Object.defineProperty
- 7 interview questions about closure
猜你喜欢
![[Golang]力扣Leetcode - 657. 机器人能否返回原点(模拟)](/img/b1/035c907253739a3e8c68b5934fd4e0.png)
[Golang]力扣Leetcode - 657. 机器人能否返回原点(模拟)

华为走在老路上

2022年环境影响评价工程师考试相关法律法规练习题及答案

小熊电器的三重压力:扩张、存货和对手

MySQL笔记(基础篇)

OJ每日一练——求分数序列之和

Exercises and answers of relevant laws and regulations in 2022 environmental impact assessment engineer examination

Opendaylight analysis of SDN learning (5)

webrtc入门:4.RTCPeerConnection连接音视频流

Opendaylight analysis of SDN learning (2)
随机推荐
基于深度模型的日志序列异常检测
How can we make the calendar note of win10 computer display 24 solar terms?
How to select ECS
正则匹配URL
ES6 Proxy和Object.defineProperty
Leetcode problem brushing plan -- monotonic sequence
Vscode most complete practical plug-in (VIP collection version)
SaaS 长河下,AfterShip 技术升级的“加减法”
PHP AES加密解密
SDN学习之Opendaylight浅析(三)
Knowing that it is listed in Hong Kong, it is the first Chinese concept stock to return to Hong Kong with dual main listing
7 interview questions about closure
Sqlalchemy filter time
Test life | less than 2 years after graduation, 0 experience and won the 30W annual salary of a well-known Internet enterprise. How did he do it?
Exercises and answers of relevant laws and regulations in 2022 environmental impact assessment engineer examination
Shiro cache management
How to efficiently manage data in a hybrid cloud?
香港云服务器怎样避免勒索软件攻击?
DevExpress WPF入门指南 - 运行时生成的POCO视图模型(一)
pip install 镜像源