Front-end Related

几种排序算法浅析--JavaScript

2017-10-11  本文已影响0人  虚玩玩TT

算法好难啊!写点简单的。然后用JavaScript实现。

排序算法(Sorting Algorithm)

概念

一种能将一串资料依照特定排序方式进行排列的一种算法

一般规则
分类方式
  1. 依据计算的 时间复杂度 分类
    • 概念:完成一个算法所用的时间
    • 表示:O(),变量为 n(表示输入的长度)
    • 最好:O(n log n)
    • 最坏:O(n²)
    • O(n): 无序数组的搜索
    • O(log n): 二分搜索
    • O(n log n):
      • 比较排序(最好的)
      • 快速排序(最好的)
      • 堆排序
    • O(n²):
      • 冒泡排序
      • 插入排序
      • 选择排序
  2. 依据 记忆体使用量(以及其他电脑资源的使用) 分类
  3. 依据 稳定性 分类
    • 例如对 (1,2) (1,3) (2,1) 中的第一个数字排序,会有两种结果
      • (1,2) (1,3) (2,1)
      • (1,3) (1,2) (2,1)
      • 这种现象就是不稳定性
    • 不稳定排序算法可能会在相等的键值中改变纪录的相对次序
    • 稳定的排序:
      • 冒泡排序
      • 插入排序
      • 归并排序
      • 计数排序 O(n + m)
      • 基数排序 O(k*n)
      • 桶排序
    • 不稳定的排序:
      • 快速排序
      • 选择排序
      • 希尔排序 O(n log² n)
      • 堆排序
  4. 依据 排序的方式 分类
    • 插入
      • 插入排序
      • 希尔排序
    • 选择
      • 选择排序
      • 堆排序
    • 交换
      • 冒泡排序
      • 快速排序
    • 归并
      • 归并排序
    • 分布
      • 基数排序
      • 计数排序
      • 桶排序
    • 并发
    • 混合
    • 其他

冒泡排序(Bubble Sort)

原理:

举例说明:

有数组 arr = [a,b,c,d],

所以外层循环次数为 (arr.length - 1)
内层循环次数由 (arr.length - 1) 开始,每次减一

代码实现:

function BubbleSort(arr){
  var n = arr.length 
  var temp
  for(var i = 0; i < n - 1; i++){
    for(var j = 0; j < n - 1 - i; j++){
      if(arr[j] < arr[j + 1]){
        temp = arr[j]
        arr[j] = arr[j + 1]
        arr[j + 1] = temp
      }
    }
  }
  return arr
}
var arr = [9,14,2,7,3]
SelectionSort(arr)

选择排序(Selection Sort)

原理:

举例说明:

有数组 arr = [a,b,c,d],

代码实现:

function SelectionSort(arr){
  var n = arr.length
  var temp
  for(var i = 0; i < n -1; i++){
    for(var j = 1 + i; j < n; j++){
      if(arr[i] > arr[j]){
        temp = arr[j]
        arr[j] = min
        arr[i] = temp
      }
    }
  }
  return arr
}
var arr = [9,14,2,7,3]
SelectionSort(arr)

插入排序(Insertion Sort)

原理:

举例说明:

有数组 arr = [a,b,c,d]

动画示例:

插入排序(来自wiki)插入排序(来自wiki)

代码实现:

function InsertionSort(arr){
  for(var i = 1; i < arr.length; i++){
    for(var j = 0; j < i; j++){
      if(arr[i] < arr[j]){
        arr.splice(j,0,arr[i])
        arr.splice(i+1,1)
      }
    }
  }
  return arr
}
var arr = [9,14,2,7,3]
InsertionSort(arr)

希尔排序(递减增量排序算法)(Shell Sort)

原理:

举例说明:

代码实现:

function ShellSort(){

}

归并排序(Merge Sort)

原理:

举例说明:

代码实现:

function MergeSort(){

}

动画示例:

归并排序(来自wiki)归并排序(来自wiki)

快速排序(Quick Sort)

原理:

举例说明:

代码实现:

function QuickSort(){

}

堆排序(Heap Sort)

原理:

举例说明:

代码实现:

function HeapSort(){

}

桶排序(Bucket Sort)

原理:

举例说明:

有数组 arr = [1,9,2,4],这里列举最理想的情况一个元素对应一个桶

代码实现:

function BucketSort(arr){
  var newArr = []  //数组的每个位置可以看成是一个桶
  var result = []  //用来存放结果
  var len = []  //这里优化对浮点数的桶排序
  var buckets = 0
  for(var k = 0; k < arr.length; k++){
    if(parseInt(arr[k]) !== arr[k]){
      len.push(String(arr[k]).split('.')[1].length)
    }
  }
  if(len.length !== 0){
    buckets = Math.pow(10,Math.max.apply(null,len))
  }
  for(var i = 0; i < arr.length; i++){
    newArr[arr[i]*buckets] = arr[i]
  }
  for(var j = 0; j < newArr.length; j++){
    if(newArr[j] !== undefined){
      result.push(newArr[j])
    }
  }
  return result 
}
var arr = [9,2.33,3.14,5.998,23,7]
BucketSort(arr)

计数排序(Counting Sort)

原理:

举例说明:

代码实现:

function CountingSort(){

}

基数排序(Radix Sort)

原理:

举例说明:

代码实现:

function RadixSort(){

}
上一篇 下一篇

猜你喜欢

热点阅读