js 数组排序的方式
来源:好兔宠物网
冒泡排序:
相邻的数据进行两两比较,小数放在前面,大数放在后面,这样一趟下来,最小的数就被排在了第一位,第二趟也是如此,如此类推,直到所有的数据排序完成。
function bubbleSort(arr) {
for (var i = 0; i < arr.length - 1; i++) {
//确定轮数
for (var j = 0; j < arr.length - i - 1; j++) {
//确定每次比较的次数
if (arr[j] > arr[j + 1]) {
tem = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tem;
}
}
console.log("第" + i + "次排序" + arr);
}
}
bubbleSort(numberList);
选择排序:
找到数组中最大(最小)的元素,将该元素与数组中第一个元素交换位置(如果第一个元素就是最大或者最小的元素那么就和自己交换位置)在剩下的元素中找到最大(小)的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。
function selectionSort(arr) {
// 外层循环,从该位置取数据,剩下最后一个数字无需选择排序,因此-1
for (let i = 0; i < arr.length - 1; i++) {
let min = i; // 初始时假设当前最小数据的下标为i,并记录在min中
// 内层循环,找出最小的数字下标
for (let j = min + 1; j < arr.length; j++) {
// 如果记录的最小数字大于当前循环到的数组数字
if (arr[min] > arr[j]) {
min = j; // 将min修改为当前的下标
}
}
// 内层循环结束,此时min记录了剩余数组的最小数字的下标
// 将min下标的数字与i位置的数字交换位置
let temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
console.log("第" + i + "次排序" + arr);
}
}
selectionSort(numberList);
快速排序:
首先设定一个分界值,通过该分界值将数组分成左右两部分。
将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。
// 快速排序
function quickSort(arr) {
//1.判断传入的数组长度,如果是一个就直接返回
//1.判断传入的数组长度,如果是一个就直接返回
if (arr.length <= 1) {
return arr;
}
//2.如果长度不为1,那么就取数组的中间值
let contentIndex = Math.floor(arr.length / 2);
let contentValue = arr.splice(contentIndex, 1)[0];
//3.先定义左右两个数组,然后让数组中剩余的数与中间数进行比较,比中间数小的放到左边的数组,比中间数大的放到右边的数组。
let leftArr = [];
let rightArr = [];
for (let i = 0; i < arr.length; i++) {
let item = arr[i];
item > contentValue ? rightArr.push(item) : leftArr.push(item);
}
//4.使用递归的方式让左右两边的数组持续这样处理,直至左右两边的数组都排好序,最后三者进行拼接
return quickSort(leftArr).concat(contentValue, quickSort(rightArr));
}
var arr = quickSort(numberList);
因篇幅问题不能全部显示,请点此查看更多更全内容