js实现几种排序算法(待补)
嵌套for循环:外层每一次执行,内层都需全部执行
1.冒泡排序
比较相邻的元素。如果第一个比第二个大,就交换他们两个
function testArr(arr){
for (var i = 0; i <= arr.length-1; i++) {
for (var 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;
}
var arr = testArr([2,1,6,3,7,4,8,5]);
console.log(arr);
i=0,排序出数组最后一位为最大的数
i=1,排序出数组倒二位,内循环最后一位不再计入循环(j<arr.length-1-i)
2.插入排序
第一个元素默认是已排序元素,取出下一个元素和当前元素比较,如果当前元素大就把下一个元素插入当前元素之前
function insertSort(arr){
let brand = [];
//第一个默认排序
brand.push(arr[0]);
for(let i=1;i<arr.length;i++){
//数组后面未排序的变量
let A = arr[i];
for(let j=brand.length-1;j>=0;j--){
//要执行所有的j
let B = brand[j];
//如果 arr[i]>B,则把A插入到数组中B的后面,数组长度加一位
if(A>B){
brand.splice(j+1,0,A);
break;
}
//如果 A(为arr[i])<B(为arr[0]),把arr[i]放到数组最前面,此时brand[0]为最小值
if(j===0){// if(A<brand[0])
brand.unshift(A);
}
}
}
return brand;
}
var arr = insertSort([5,2,1,6,3,7,4,8,9]);
console.log(arr);
初始B为5
5>arr[1]=2则执行if(j===0)则brand为[2,5]
2>arr[2]=1则执行if(j===0)则brand为[1,2,5]
brand[j]<arr[3]=6则执行if(A>B)则brand为[1,2,5,6]
依次类推,数组不一样执行方式也不一样
3.选择排序
首先从数组中找到最小的元素,并把该元素放在数组的最前面,然后再从剩下的元素中寻找最小的元素,放在之前最小元素的后面,直到排序完毕
function selectionSort(arr) {
var len = arr.length,min,temp;
for (var i = 0; i < len - 1; ++i) {
min = i;//最初默认的最小值下标
for (var j = i + 1; j < len; ++j) {
if (arr[j] < arr[min]) {
min = j;//最小值改变时下标更新
}
}
temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
return arr;
}
var arr = selectionSort([5,2,1,6,3,7,4,8,9]);
console.log(arr);
i=0,arr[min]=3循环后面的所有元素,如果哪个小就记录最小下标,直到循环所有的元素的最小值下标
然后本次的最小值与最初的arr[min]交换。下面步骤同理
i=1,
.
.
.