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)