您的当前位置:首页正文

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);

因篇幅问题不能全部显示,请点此查看更多更全内容