常见的数组排序方法
1.冒泡排序
(bubble sort)
//将最大的数值不断的交换放在最后的方式叫做冒泡
var arr=[2,5,1,7,18,1,2,9,5,3,12,11,2,13];
for(var i=0;i<arr.length;i++){
for(var j=0;i<arr.length-1-i;i++){
if(arr[j]>arr[j+1]){
var temp= arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
/*或者使用结构赋值
[arr[j],arr[j+1]]=[arr[j+1],arr[j]]
*/
}
}
}
//可以去添加一个开关 用来检查数组是否还在交换,如果没有交换可以跳出程序,用于提升性能
for(var i=0;i<arr.length;i++){
for(var j=0;i<arr.length-1-i;i++){
var flag=true;
if(arr[j]>arr[j+1]){
var temp= arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
/*或者使用结构赋值
[arr[j],arr[j+1]]=[arr[j+1],arr[j]]
*/
flag=false;
}
if(flag) break;
}
}
//这个要复杂一点
var arr1=[1,5,8,2,3,2,4,5,6,5,1,7,8,9,5,4,1,2,3,5,5,4,1,9,7,8,8,9,5,4,2,3,6,7,8,4,2,5];
var arr2=[];
for(var i=0;i<arr1.length;i++){
var isAdd = true;//开关
for(var j=0;j<arr2.length;j++){
if(arr1[i]==arr2[j]){
isAdd=false;
break;
}
}
if(isAdd){
arr2[arr2.length]=arr1[i];
}
}
2.选择排序
(Selection sort)
var arr=[2,5,1,7,18,1,2,9,5,3,12,11,2,13];
for(var i=0;i<arr.length-1;i++){
var min=i;
for(var j = i+1;j<arr.length;j++){
if(arr[min]<arr[j]) min=j;
}
if(min==j) continue;
var temp=arr[i];
arr[i]=arr[min];
arr[min]=temp;
//可以解构
}
3.快速排序
(Quick sort)
var arr=[2,5,1,7,18,1,2,9,5,3,12,11,2,9,13];
function quickSort(arr){
if(arr.length<=0) return arr;
var n=~~(arr.length/2);
var current=arr[n];
var left=[],right=[];
for(var i=0;i<arr.length;i++){
if(i===n) continue;
if(arr[i]<=current) left.push(arr[i])
else right.push(arr[i]);
}
return quickSort(left).concat(current,quickSort(right));
}
4.插入排序
for(i =1;i<arr.length;i++){
for(var n=i;n>=0;n--){
if(arr[n]>arr[n+1]){
var temp=arr[n];
arr[n]=arr[n+1];
arr[n+1]=temp;
}
}
}
5.希尔排序
for(var step=~~((arr.length)/2);step>0;step=~~((step)/2)){
for( var i=step;i<arr.length;i++){
for(var j=1-step;j>=0 && arr[j]>arr[step+j];j-=step){
var temp=arr[j];
arr[j]=arr[step+j];
arr[step+j]=temp;
}
}
}
6.计数排序
var arr = [ 1, 3, 2, 1, 2, 3, 2, 1, 2, 3, 4, 5, 10, 3, 2, 1 ]
console.log('原始数组 : ', arr)
// 1. 对 arr 数组进行统计操作
var countArr = []
// 1-1. 遍历原始数组
for (var i = 0; i < arr.length; i++) {
var item = arr[i]
// 1-2. 开始统计
countArr[item] ? countArr[item]++ : countArr[item] = 1
}
console.log('统计结果 : ', countArr)
// 2. 根据统计向原始数组内插入
// 2-1. 清空原始数组
arr.length = 0
// 2-2. 遍历统计数组
for (var j = 0; j < countArr.length; j++) {
if (!counrArr[j]) continue
// j 就是每一次要插入的数据
// countArr[j] 就是每次要插入多少个
for (var k = 0; k < countArr[j]; k++) {
arr[arr.length] = j
}
}
console.log('排序之后 : ', arr)
随机乱序
var arr=Array(100).fill(1).map(function(item,i){
return i+1
}).sort(function(){
return Math.random()-0.5;
})
//从1-100的随机乱序数组
随机颜色
//16进制
var color=Array(6).fill(1).reduce(function(v,t){
return v+(~~(Math.random()*16)).toString(16);
},"#");
console.log(color)
//rgb
function rgbColor(){
let color="rgb(";
for(var i=0;i<3;i++) color+=~~(Math.random()*256)+",";
color=color.substring(0,color.length-1)+")"
return color
}
//rgba
function rgbaColor(alpha){
alpha = alpha==undefined? (Math.random()*10/10).toFixed(1) : alpha;
alpha=Number(alpha);
if(isNaN(alpha)) alpha=1;
var color = "rgba(";
for(var i=0;i<3;i++){
color+=parseInt(Math.random()*256)+",";
}
color+= alpha+")";
return color;