//1、冒泡排序
Array.prototype.bubbleSort = function () {
//主要思想:找到最大值->次大值->....依次放到序列最后面
//------从后面开始有序,前面无序,需要寻找
for (let i = 0; i < this.length - 1; i++) {//注意:边界
for (let j = 0; j < this.length - i - 1; j++) {//注意:边界
if (this[j] > this[j + 1]) {
var tmp = this[j + 1];
this[j + 1] = this[j];
this[j] = tmp;
}
}
}
return this;
}
//2、插入排序
Array.prototype.insertionSort = function () {
//主要思想:找到一个数,前移直到某一个位置,前一个数比它更小
//从前开始有序
for (let i = 1; i < this.length; i++) {
const cur = this[i]; //当这个位置的数取出来时,相当于此处空了出来,可以依次往后移动
for (let j = i - 1; j >= 0; j--) {
if (this[j] > cur) {
this[j + 1] = this[j];
if (j === 0) {//当已经到开头的位置时候,移动了,但是由于j没有修改开头
this[j] = cur;
}
}
else {//停止
this[j + 1] = cur;
break;
}
}
}
return this;
}
//3、选择排序
Array.prototype.selectSort = function () {
//主要思想:和冒泡排序找大的放后不同,这个是两次遍历找最小放在前面
//从前面开始有序
for (let i = 0; i < this.length - 1; i++) {
let min = this[i], min_index = i;
for (let j = i + 1; j < this.length; j++) {
if (this[j] < min) {
min = this[j];
min_index = j;
}
}
//交换位置,不是直接替代!!!
const tmp = this[i];
this[i] = min;
this[min_index] = tmp;
}
return this;
}
//---------递归思想
//4、归并排序
Array.prototype.mergeSort = function () {
//主要思想:两两区间有序再归并
//创建递归子函数
var merge = (arr) => {
const len = arr.length;
if (len <= 1) return arr;//-------对于递归一定要创造递归终结条件
let res = [];
const mid = Math.floor(len / 2);
//slice切割,左右都有序
//注意左右区间取值长度-------一定要有可能arr长度为1,,,,所以mid+1会导致死循环
let leftArr = merge(arr.slice(0, mid));
let rightArr = merge(arr.slice(mid, len));
//合并两个有序数据
//-----有趣的JS做法
while (leftArr.length || rightArr.length) {
if (leftArr.length && rightArr.length) {
res.push(leftArr[0] < rightArr[0] ? leftArr.shift() : rightArr.shift());
}
else if (leftArr.length) {
res.push(leftArr.shift());
}
else if (rightArr.length) {
res.push(rightArr.shift());
}
}
return res;
}
let res = merge(this);
res.forEach((n, i) => {
this[i] = n;
})
return this;
}
//5、快速排序
Array.prototype.fastSort = function () {
//主要思想,找到一个基准值,左边全放它小的;右边全放大的
let fast = (arr) => {
const len = arr.length;
if (len <= 1) return arr;
//始终以第一个元素作为基准值
const cur = arr[0];
let left = [];
let right = [];
//开始找其他的数要排除自己!!!! 所以i的初始值要设置为 1 !!
for (let i = 1; i < len; i++) {
if (arr[i] < cur) {
left.push(arr[i]);
}
else {
right.push(arr[i]);
}
}
return [...fast(left), cur, ...fast(right)];
}
let res = fast(this);
res.forEach((n, i) => {
this[i] = n;
})
return this;
}
//注意:Array初始化的方法!!!无需中括号
//var arr=[....]; 隐式创建Array
var arr = new Array(2, 8, 9, 10, 1, 5, 6, 4, 3, 7);
//测验
//arr.bubbleSort();
//arr.insertionSort();
//arr.selectSort();
//arr.mergeSort();
arr.fastSort();
console.log(arr);
用JS实现5种常用排序
猜你喜欢
转载自blog.csdn.net/weixin_57208584/article/details/129642842
今日推荐
周排行