理解冒泡排序和快速排序以及JS代码实现

一、冒泡排序

原理

已知一个数组是一组数据,比较相邻两个数字,如果arr[i]>arr[i+1],则交换二者位置。

例如在数组[1, 4, 9, 0, 3, 7, 2]中:

  • 第一轮:1<4,不交换位置;4<9,不交换位置;9>0,交换0和9的位置;9>3,交换位置;9>7,交换位置;9>2,交换位置。结束第一轮排序,此时结果为[1,4,0,3,7,2,9]

  • 第二轮:1<4,不交换位置;4>0,交换位置;4>3,交换位置;4<7,不交换位置;7>2,交换位置;7<9,不交换位置。结束第二轮排序,此时结果为[1,0,3,4,2,7,9]

  •  重复以上步骤,最终结果为:[0,1,2,3,4,7,9]

JS实现

        在上个例子中,从第二轮开始的7和9作比较其实是多余的,因为在第一轮的时候已经把最大的值放到最后了,同理,在第三轮的4和7无需比较,所以每次只需要对从索引为0到length - 1 - i

    // 冒泡排序
    let numArr = [1, 4, 9, 0, 3, 7, 2];
    for (let i = 0; i < numArr.length - 1; i++) {
      for (let j = 0; j < numArr.length - 1 - i; j++) {
        // 如果当前元素大于后一个元素 ,交换位置
        if (numArr[j] > numArr[j + 1]) {
          numArr[j] = numArr[j] + numArr[j + 1];
          numArr[j + 1] = numArr[j] - numArr[j + 1];
          numArr[j] = numArr[j] - numArr[j + 1];
        }
      }
    }
    console.log(numArr)

二、快速排序

原理

        每次选择一个值,一般为数组的第一项,大于该值的放到右边,小于该值的放在左边。按照这个步骤再分别对左边和右边的数据进行排序,重复这个步骤,直到排序结束。

例如在数组[1, 4, 9, 0, 3, 7, 2]中:

JS实现

    // 快速排序
    let arr = [5, 4, 3, 1, 6, 3, 8, 7];
    function quickSort(arr, val) {
      if (arr.length <= 1) {
        return arr;
      }
      let pivot = arr[0]; // 选取基准值
      let leftArr = [];
      let rightArr = [];
      for (let i = 1; i < arr.length; i++) {
        if (arr[i] < pivot) {
          leftArr.push(arr[i]); 
        } else {
          rightArr.push(arr[i]);
        }
      }
      let leftSorted = quickSort(leftArr,'left'); // 对左侧数组进行递归排序
      let rightSorted = quickSort(rightArr,'right'); // 对右侧数组进行递归排序
      return leftSorted.concat([pivot], rightSorted); // 合并左、中、右三个数组
    }
     console.log(quickSort(arr)) 

总结

        本篇介绍了冒泡排序和快速排序两种排序方法,并用JS实现了这两种排序,如有错误,欢迎斧正!

猜你喜欢

转载自blog.csdn.net/sxww_zyt/article/details/129879163
今日推荐