排序算法

185 阅读1分钟

最近越来越觉得算法的重要性,就和数字竞赛,考的就是这样逻辑性思维题,废话不多说,先上以下几种排序算法。

1. 冒泡排序

let arr = [4,5,1,3,8,6,7]

function sort(arr) {
  for (let j = 0;j<arr.length-1;j++) {
    let sorted = false
    let sortend = arr.length - j - 1
    for (let i = 0; i < sortend; i++) {
      if (arr[i+1] < arr[i]) {
        let tmp = arr[i]
        arr[i]=arr[i+1]
        arr[i+1]=tmp
        sorted=true
        sortend=i+1
      }
    }
    if (!sorted) {
      break
    }
  }
  
  return arr
}
console.log(sort(arr))

时间复杂度:O(n²)

由冒泡排序衍生的一个问题,求第K个最大的值,这种问题也可用冒泡排序。冒泡排序就是每一轮得到一个最大值,那第k轮就能得到最K个最大值。代码如下:

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findKthLargest = function(nums, k) {
    let temp = []
    for (let i = 0; i < k; i++) {
        let maxIndex = i
        for (let j = i + 1; j < nums.length; j++) {
            if (nums[j] > nums[maxIndex]) {
                maxIndex = j
            }
        }
        let temp = nums[i]
        nums[i] = nums[maxIndex]
        nums[maxIndex] = temp
    }
    return nums[k-1]
};

2. 鸡尾酒排序

let arr2 = [2,3,4,5,6,7,1]
function sort2(arr) {
    for (let j = 0;j<arr.length/2;j++) {
        let sorted = false
        for (let i = j; i < arr.length - j - 1; i++) {
            if (arr[i+1] < arr[i]) {
                let tmp = arr[i]
                arr[i]=arr[i+1]
                arr[i+1]=tmp
                sorted=true
            }
        }
        if (!sorted) {
            break
        }
        sorted = false
        for (let i = arr.length - j - 1; i >j; i--) {
            if (arr[i-1] > arr[i]) {
                let tmp = arr[i]
                arr[i]=arr[i-1]
                arr[i-1]=tmp
                sorted=true
            }
        }
        if (!sorted) {
            break
        }
    }
        
    return arr
}
console.log(sort2(arr2))

时间复杂度:O(n²)

3. 快速排序

分治法,需要找基点

 let arr3 = [4,5,1,3,8,6,7]
function quickSort(arr, left, right) {
    if (left >= right) return
    const pivotIndex = partitionArr(arr, left, right)
    quickSort(arr, left, pivotIndex - 1)
    quickSort(arr, pivotIndex + 1, right)
}
function partitionArr(arr, left, right) {
    let temp = arr[right]
    while(left !== right) {
        while (left < right && arr[left] <= temp) {
            left++
        }
        if (left < right) {
            arr[right] = arr[left]
            right--
        }
        while (left < right && temp <= arr[right]) {
            right--
        }
        if (left < right) {
            arr[left] = arr[right]
            left++
        }
    }
    arr[left] = temp
    console.log(arr)
    return left
}
quickSort(arr3, 0,arr3.length-1)
console.log(arr3)

时间复杂度:O(nlogn)

4. 计数排序

let arr4 = [4,5,1,3,8,6,7]
 function countSort(arr) {
     let max = Math.max(...arr)
     let min = Math.min(...arr)
     const diff = max - min
     const _arr = []
     for (let i = 0; i < diff + 1; i++) {
        _arr[i] = 0
     }
     for (let i = 0; i < arr.length; i++) {
        _arr[arr[i] - min] = _arr[arr[i] - min] + 1
     }
     const rs = []
     for (let i = 0, k = 0; i < _arr.length; i++) {
        if (_arr[i]!=0) {
            for (let j = 0; j < _arr[i]; j++) {
                rs[k] = i + min
                k++
            }
        }
     }
    return rs 
 }
 console.log(countSort(arr4))

时间复杂度:O(n)