[小记] js中的几种排序方法

js中的几种排序方法

  • 参考后自行补充修改,均已测试运行过,升序降序可自行更改,记录以备用
// javascript 的 sort() 数组对象排序-按指定元素降序
// js - sort() 方法用于对数组的元素进行排序;排序可以是按字母或数字;默认排序顺序为按字母升序。数组在原数组上进行排序,不生成副本。
// sort()函数有一个参数:sortfunction(可选) - 规定排序顺序,必须是函数,默认排序顺序为按字母升序。
// 使用数字排序,你必须通过一个函数作为参数来调用-函数指定数字是按照升序还是降序排列。
var arr = [          
  { name:"小恭",age:11 },          
  { name:"小发",age:3 },          
  { name:"小喜",age:12 },          
  { name:"小财",age:40 }         
];
console.log("原数组对象:");
console.log(arr);
console.log(arr[0]);
var compare = function(obj1,obj2) {  
  var val1 = obj1.age;    
  var val2 = obj2.age;    
  if(val1 < val2) {  
    return 1;  
  } else if(val1 > val2) {  
    return -1;    
  } else {  
    return 0;  
  }
}
console.log("数组对象排序结果:");
var sortArr = arr.sort(compare);
console.log(sortArr);
console.log(sortArr[0]);

//数组去重
Array.prototype.distinctArr = function() {
  var ret = []; //ret[]用于存放被删除的重复元素
  for (var i = 0; i < this.length; i++) {
    for (var j = i + 1; j < this.length;) {
      if (this[i] === this[j]) {
        ret.push(this.splice(j, 1)[0]);
      } else {
        j++;
      }
    }
  }
  console.log(ret);
  return this; //为了实现链式写法
}
//for distinct test
alert(['a','b','c','d','b','a','e'].distinctArr());

console.log("-----分割线------");

// 插入排序
// 原理:每有一个新元素。则将该新元素插入到合适的位置
var canArr = [0,4,2,6,7,8,2,14,57,8,99,0,45,32,12,1,1,1,1,45,0,9,8,7,6,5,4,3,2,115,67,68,56,55,43,21];
console.log("插入排序原数组:");
console.log(canArr);
var quchArr = canArr.distinctArr();
console.log("去重后数组:");
console.log(quchArr);
console.log("插入排序结果为:");
console.log(insertSort(quchArr)); 
//插入排序实现方法(升序、降序 二选一)
function insert(arr) {  
  console.log("插入排序执行~");
  var temp;     
  //升序↑  
  for (var i = 1; i < arr.length; i++) {       
    for (var j = i-1; j >= 0; j--) {         
      if (arr[j + 1] < arr[j]) {
        // 如果后插入数据小于前一位,互换两者位置           
        temp = arr[j + 1];             
        arr[j + 1] = arr[j];         
        arr[j] = temp ;    
        // console.log(arr); //可以打印出来每一个改变的步骤
      }         
    }      
  }
  //降序↓  
  // for (var i = 1; i < arr.length; i++) {      
  //  for (var j = i - 1; j >= 0; j--) {          
  //    if (arr[j + 1] > arr[j]) {
  //      // 如果后插入数据[j+1]大于前一位[j],互换两者位置
  //      temp = arr[j + 1];             
  //      arr[j + 1] = arr[j];         
  //      arr[j] = temp;    
  //      // console.log(arr); //可以打印出来每一个改变的步骤
  //    }          
  //  }      
  // }  
  return arr;
}

console.log("-----分割线------");

// 3. 冒泡排序
// 原理:每一组循环将最小的-降序(最大的-升序)项放置在最后的位置。循环组数为 (length-1);每组循环 (length-已循环组数-1) 次
function bubble(arr) {  
  var temp; 
  for (var i = 0; i < arr.length - 1; i++) {
    // 每组循环后,最后的一个元素位置
    for (var j = 0; j < arr.length - i - 1; j++) {
      // 降序↓
      if (arr[j + 1] > arr[j]) {
        // 后面项大于当前项,则交换两者位置
        temp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
      }
    } 
  } 
  return arr;
}
console.log("冒泡排序↓");
var bubbleArr = [1,2,5,3,9,8,11,98,25,119,101]
console.log("原数组:");
console.log(bubbleArr);
console.log("冒泡排序结果:");
console.log(bubble(bubbleArr));

console.log("-----分割线------");

// 快速排序
var quickSort = function(arr) {        
  if(arr.length < 1) {
    // 如果数组就是一项,那么可以直接返回                
    return arr;        
  }        
  // 获取数组中间的索引        
  var centerIndex = Math.floor(arr.length / 2);
  // 获取数组中间项        
  var centerValue = arr[centerIndex];
  var left = [];
  var right = [];        
  for(var i = 0; i < arr.length; i++) {                
    if (arr[i] < centerValue) {                        
      left.push(arr[i]);                
    } else {                        
      right.push(arr[i]);                
    }
  }        
  return quickSort(left).contract([centerValue], quickSort(right)); // 递归调用
}
console.log("快速排序↓");
var quickArr = [1,2,5,3,9,8,11,98,25,119,101]
console.log("原数组:");
console.log(quickArr);
console.log("快速排序结果:");
console.log(bubble(quickArr));

参考:
https://www.cnblogs.com/ybygb-geng/p/9355425.html
(https://blog.csdn.net/qq_31249751/article/details/80769677)
(https://blog.csdn.net/sinat_40036449/article/details/80886337)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值