排序算法
冒泡排序
思路:外层循环从1到n-1,内循环从当前外层的元素的下一个位置开始,依次和外层的元素比较,出现逆序就交换,通过与相邻元素的比较和交换来把小的数交换到最前面。
function bubble(arr) {
for(let i = 0; i < arr.length - 1; i++) {
for(let j = 0; j < arr.length - 1 - i; j++) {
if(arr[j] > arr[j+1]) {
[arr[j], arr[j+1]] = [arr[j+1], arr[j]]
}
}
}
return arr
}
插入排序
思路:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。可以理解为玩扑克牌时的理牌;
function insert(arr){
// 抓扑克牌的思路
// 准备一个新数组,用来存储抓到手里的牌
let handle = []
// 随机抓第一张牌放到新数组中
handle.push(arr[0])
// 从第二项开始一次抓牌
for(let i = 1; i < arr.length;i++){
// A是新抓的牌
let A = arr[i]
for(let j = handle.length-1; j>=0;j--){
// 从手里的最后一张牌开始和每次新抓的牌比较
let B = handle[j]
if(A>B){
handle.splice(j+1,0,A)
break;
}
if(j==0){
handle.unshift(A)
}
}
}
return handle
}
快速排序
首先取出中间的元素,用中间元素和其他元素相比较,比中间元素小的放在一个数组中,比中间元素大的放在另一个数组中,然后对这两个数组进行同样的操作,最后把所有细分的数组连接起来
思路:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
function quick(arr) {
if(arr.length<=1){
return arr
}
let middleIndex = Math.floor(arr.length / 2)
let middleVal = arr.splice(middleIndex,1)[0]
let leftArr = []
let rightArr = []
for(let i = 0; i<arr.length; i++)
{
let item = arr[i]
item<middleVal?leftArr.push(item):rightArr.push(item)
}
return quick(leftArr).concat(middleVal, quick(rightArr))
}
选择排序
选择排序是:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
function selectSort(arr){
let n = arr.length
for(let i = 0; i < n-1; i++) {
let min = i
for(let j = i+1; j<n; j++){
if(arr[j] < arr[min]){
min = j
}
}
[arr[i], arr[min]] = [arr[min], arr[i]]
}
return arr
}
希尔排序
思路:希尔排序是插入排序的一种高效率的实现,也叫缩小增量排序。先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录基本有序时再对全体记录进行一次直接插入排序。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

function shellSort(arr){
}