三种排序方法
1.冒泡排序
//冒泡排序 由小到大
//如果前边比后面的大,交换两个元素的位置 每比较一轮,出一个大数
var arr=[8,5,1,2];
//第一轮 8 5 比较---5 8-[5,8,1,2] 8 1--[5,1,8,2] 8 2--[5,1,2,8] 3次 推出最大数
//第二轮 5 1 ---[1,5,2,8] 5 2---[1,2,5,8] 2次 推出最大的2位
//第三轮 1 2---[1,2,5,8] 1次
//arr.length-1
//轮数
for(i=0;i<arr.length-1;i++){
//次数
for(var j=0;j<arr.length-1-i;j++){
//交换位置
if(arr[j]>arr[j+1]){
//交换两个数的位置,不能直接交换,要有第三个变量
// let temp=arr[j];//先用temp存储arr[j]
// arr[j]=arr[j+1];
// arr[j+1]=temp;
[arr[j],arr[j+1]]=[arr[j+1],arr[j]];
}
}
}
console.log(arr);
插入排序
//插入排序
var arr=[34,56,12,66,12];
function insertSort(arr){
//1.创建一个新数组,将老数组的第一位放在新数组里
// var newArr=[arr[0]];
var newArr=[];
newArr.push(arr[0]);
console.log(newArr);
//循环老数组,从索引i=1开始,获取每一项
for(i=1;i<arr.length;i++){
var item=arr[i];
//新数组从右向左倒序比较
for(var j=newArr.length-1;j>=0;j--){
var newitem=newArr[j];
//如果老数组哪项大于等于新数组的哪一项,就插到新数组的哪项后边
if(item>=newitem){
//默认splice(i,0,xx)插入那项前边
newArr.splice(j+1,0,item);
break;//插入完数据后,内层循环已经结束
}
//比较一圈,新数组的哪项内容都比老数组的哪项大,插到最前边
//arr.lrngth-1---->0
if(j==0){
newArr.unshift(item);
}
}
}
return newArr;
}
var newArr=insertSort(arr);
console.log(newArr);
3.快速排序
/*快速排序
var ary=[12,15,14,13,16,11];
原理:先拿出中间项,然后把此项从数组中删除掉,让数组中的剩余项一一跟这个中间项做比较,新建两个左右数组,如果大的项就放到右盒子,如果小的项就放到左盒子
[左盒子小]--中间项--[右盒子大]
依次再继续重复相同的步骤,把左盒子和右盒子都进行排序,直到出现空数组或者一项的时候停止
*/
function quickSort(ary){
if(ary.length<=1){
return ary;
}
var centerIndex=Math.floor(ary.length/2);
// 拿到中间项的同时,把中间项从数组中删除掉
var centerValue=ary.splice(centerIndex,1)[0];
// 新建两个数组:leftAry,rightAry;把ary中剩余的项,给中间项做对比,如果大项就放到右数组,小项就放到左数组.
var leftAry=[],rightAry=[];
for(var i=0;i<ary.length;i++){
if(ary[i]<centerValue){
leftAry.push(ary[i]);
}else{
rightAry.push(ary[i]);
}
}
return quickSort(leftAry).concat(centerValue,quickSort(rightAry));
}
var ary=[12,15,14,13,16,11];
var res=quickSort(ary);
console.log(res);