三种排序方式 冒泡排序 插入排序 选择排序 js排序 js怎么排序【经典面试题】排序算法 什么是排序

10 篇文章 0 订阅
9 篇文章 0 订阅

JS三种排序方法

前提

假如我们有一个数组  数组的长度为 n,我们需要将一个数据插入到数据的第 k 个位置,则需要将 k 到 n 位元素都顺序地往后挪动一位。

而排序 则需要重复的调用这一操作

这无疑是很麻烦 而且费时间 和算力的。

尽量少的执行插入能提升性能和速度

数组又是很底层的东西 会需要大量的操作  所以如何快速 又有效的排序就成为了一个问题 

 冒泡

原始的方法 也最容易理解 但也是最耗费效率的 一般正式开发中极少有用到  但作为最初始的方法 也应理解

简单的解释就是 不断对比两个相邻的值 将其中大的一个 放在后面  //当然如果你愿意的话 也可以将小的放在后面

最大的值 无论和谁比都是大的 就会一直被放在后面 一路被放到最后

所以执行完一轮以后 最大  的  必然 被放在最后一位 , 必然

然后去执行第二轮 重复上面的操作 会将第二大的值  放在倒数第二位

以此往复 到最后一个的时候 数组就排完了

   var arr = [23,13, 23, 1, 12, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
    for (var i = 0; i < arr.length; i++) {
        for (var j = 0; j < arr.length; j++) {
            if (arr[j] > arr[j + 1]) {
                var temp = arr[j]
                arr[j] = arr[j + 1]
                arr[j + 1] = temp
				console.log(arr)
            }
		
        }
		console.log("=======")
    }


(15) [13, 23, 23, 1, 12, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76] //此行将13 和23 调换位置
 (15) [13, 23, 1, 23, 12, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]//此行将1 和23 调换位置
 (15) [13, 23, 1, 12, 23, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]//此行将23 和12 调换位置
 (15) [13, 23, 1, 12, 23, 37, 45, 98, 20, 14, 17, 58, 36, 47, 76]//此行将37 和45 调换位置
 (15) [13, 23, 1, 12, 23, 37, 45, 20, 98, 14, 17, 58, 36, 47, 76]//此行将20 和98 调换位置
 (15) [13, 23, 1, 12, 23, 37, 45, 20, 14, 98, 17, 58, 36, 47, 76]//此行将14 和98 调换位置
 (15) [13, 23, 1, 12, 23, 37, 45, 20, 14, 17, 98, 58, 36, 47, 76]//此行将17 和98 调换位置
 (15) [13, 23, 1, 12, 23, 37, 45, 20, 14, 17, 58, 98, 36, 47, 76]//此行将58 和98 调换位置
 (15) [13, 23, 1, 12, 23, 37, 45, 20, 14, 17, 58, 36, 98, 47, 76]//此行将36 和98 调换位置
 (15) [13, 23, 1, 12, 23, 37, 45, 20, 14, 17, 58, 36, 47, 98, 76]//此行将47 和98 调换位置
 (15) [13, 23, 1, 12, 23, 37, 45, 20, 14, 17, 58, 36, 47, 76, 98]//此行将76 和98 调换位置
 =======   //第一轮结束 98 被调换到了最后
 (15) [13, 1, 23, 12, 23, 37, 45, 20, 14, 17, 58, 36, 47, 76, 98]
 (15) [13, 1, 12, 23, 23, 37, 45, 20, 14, 17, 58, 36, 47, 76, 98]
 (15) [13, 1, 12, 23, 23, 37, 20, 45, 14, 17, 58, 36, 47, 76, 98]
 (15) [13, 1, 12, 23, 23, 37, 20, 14, 45, 17, 58, 36, 47, 76, 98]
 (15) [13, 1, 12, 23, 23, 37, 20, 14, 17, 45, 58, 36, 47, 76, 98]
 (15) [13, 1, 12, 23, 23, 37, 20, 14, 17, 45, 36, 58, 47, 76, 98]
 (15) [13, 1, 12, 23, 23, 37, 20, 14, 17, 45, 36, 47, 58, 76, 98]
 =======
 (15) [1, 13, 12, 23, 23, 37, 20, 14, 17, 45, 36, 47, 58, 76, 98]
 (15) [1, 12, 13, 23, 23, 37, 20, 14, 17, 45, 36, 47, 58, 76, 98]
 (15) [1, 12, 13, 23, 23, 20, 37, 14, 17, 45, 36, 47, 58, 76, 98]
 (15) [1, 12, 13, 23, 23, 20, 14, 37, 17, 45, 36, 47, 58, 76, 98]
 (15) [1, 12, 13, 23, 23, 20, 14, 17, 37, 45, 36, 47, 58, 76, 98]
 (15) [1, 12, 13, 23, 23, 20, 14, 17, 37, 36, 45, 47, 58, 76, 98]
 =======
 (15) [1, 12, 13, 23, 20, 23, 14, 17, 37, 36, 45, 47, 58, 76, 98]
 (15) [1, 12, 13, 23, 20, 14, 23, 17, 37, 36, 45, 47, 58, 76, 98]
 (15) [1, 12, 13, 23, 20, 14, 17, 23, 37, 36, 45, 47, 58, 76, 98]
 (15) [1, 12, 13, 23, 20, 14, 17, 23, 36, 37, 45, 47, 58, 76, 98]
 =======
 (15) [1, 12, 13, 20, 23, 14, 17, 23, 36, 37, 45, 47, 58, 76, 98]
 (15) [1, 12, 13, 20, 14, 23, 17, 23, 36, 37, 45, 47, 58, 76, 98]
 (15) [1, 12, 13, 20, 14, 17, 23, 23, 36, 37, 45, 47, 58, 76, 98]
 =======
 (15) [1, 12, 13, 14, 20, 17, 23, 23, 36, 37, 45, 47, 58, 76, 98]
 (15) [1, 12, 13, 14, 17, 20, 23, 23, 36, 37, 45, 47, 58, 76, 98]
10 =======

但此方法 调换次数过多,无用功过多 因为并不实用    此图引用于https://www.jianshu.com/p/ad45b42cc567

选择排序

相比于冒泡 选择就显得聪明的多了

简单的说是 以对比然后交换索引的方法 代替 冒泡的直接交换位置

首先让索引指向第一个数 然后让索引去冒泡 两两对比然后存储最小值的索引  //当然 你乐意的话也可以存大的

然后交换 初始位置 和 指向位置 的两个值

这样 每轮只有一次交换位置 大大节省了算力

var arr = [23, 13, 23, 1, 12, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]

function Sort(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;  //交换位置
		console.log(arr)
	}
	return arr;
}
Sort(arr)

========结果为=======
(15) [1, 13, 23, 23, 12, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
 (15) [1, 12, 23, 23, 13, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
 (15) [1, 12, 13, 23, 23, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
 (15) [1, 12, 13, 14, 23, 45, 37, 98, 20, 23, 17, 58, 36, 47, 76]
 (15) [1, 12, 13, 14, 17, 45, 37, 98, 20, 23, 23, 58, 36, 47, 76]
 (15) [1, 12, 13, 14, 17, 20, 37, 98, 45, 23, 23, 58, 36, 47, 76]
 (15) [1, 12, 13, 14, 17, 20, 23, 98, 45, 37, 23, 58, 36, 47, 76]
 (15) [1, 12, 13, 14, 17, 20, 23, 23, 45, 37, 98, 58, 36, 47, 76]
 (15) [1, 12, 13, 14, 17, 20, 23, 23, 36, 37, 98, 58, 45, 47, 76]
 (15) [1, 12, 13, 14, 17, 20, 23, 23, 36, 37, 98, 58, 45, 47, 76]
 (15) [1, 12, 13, 14, 17, 20, 23, 23, 36, 37, 45, 58, 98, 47, 76]
 (15) [1, 12, 13, 14, 17, 20, 23, 23, 36, 37, 45, 47, 98, 58, 76]
 (15) [1, 12, 13, 14, 17, 20, 23, 23, 36, 37, 45, 47, 58, 98, 76]
 (15) [1, 12, 13, 14, 17, 20, 23, 23, 36, 37, 45, 47, 58, 76, 98]

此图引用于https://www.jianshu.com/p/ad45b42cc567

插入排序

插入排序的原理 是让前面的每一个值进行对比

拿第6个值举例子

让第6个值先与第5个对比 如果第5个大 就再与第4个比 如果第4个大就再与第3个比

如果! 第三小的话  就把第6个放在第三个后

=======以上 看起来好像不一定管用===但是要注意 正常的程序一定是从 第一个值开始的 然后第二个第三个  这样才能保证 第一位绝对是最小的 第二位是第二小的=====

 

var arr = [23, 13, 23, 1, 12, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
	function Sort(arr) {
    	var len = arr.length;
    	var index, cnt;
		for (var i = 1; i < len; i++) {
			index = i - 1;
			cnt = arr[i];
			while (index >= 0 && arr[index] > cnt) {
				arr[index + 1] = arr[index];
				index--;
			}
			arr[index + 1] = cnt;
			console.log(arr)
		}
		return arr;
	}
			
	Sort(arr)
========结果为======
(15) [13, 23, 23, 1, 12, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
 (15) [13, 23, 23, 1, 12, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
 (15) [1, 13, 23, 23, 12, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
 (15) [1, 12, 13, 23, 23, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
 (15) [1, 12, 13, 23, 23, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
 (15) [1, 12, 13, 23, 23, 37, 45, 98, 20, 14, 17, 58, 36, 47, 76]
 (15) [1, 12, 13, 23, 23, 37, 45, 98, 20, 14, 17, 58, 36, 47, 76]
 (15) [1, 12, 13, 20, 23, 23, 37, 45, 98, 14, 17, 58, 36, 47, 76]
 (15) [1, 12, 13, 14, 20, 23, 23, 37, 45, 98, 17, 58, 36, 47, 76]
 (15) [1, 12, 13, 14, 17, 20, 23, 23, 37, 45, 98, 58, 36, 47, 76]
 (15) [1, 12, 13, 14, 17, 20, 23, 23, 37, 45, 58, 98, 36, 47, 76]
 (15) [1, 12, 13, 14, 17, 20, 23, 23, 36, 37, 45, 58, 98, 47, 76]
 (15) [1, 12, 13, 14, 17, 20, 23, 23, 36, 37, 45, 47, 58, 98, 76]
 (15) [1, 12, 13, 14, 17, 20, 23, 23, 36, 37, 45, 47, 58, 76, 98]	

此图引用于https://www.jianshu.com/p/ad45b42cc567 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值