js實現資料結構及演算法之排序演算法

eternalless發表於2018-09-06

氣泡排序

氣泡排序是最慢的排序演算法之一,資料值會像起跑一樣從陣列的一端漂浮到另一端

動畫演示

js實現資料結構及演算法之排序演算法

js實現

var CArray = function () {
  this.dataStore = [9,5,6,8,2,7,3,4,1]   //定義陣列
  this.swap = swap;      //數值交換位置
  this.bubbleSort = bubbleSort  //氣泡排序
}
function swap(arr, index1, index2) {
  var temp = arr[index1]
  arr[index1] = arr[index2]
  arr[index2] = temp
}
function bubbleSort() {
  var data = this.dataStore
  var numlength = data.length
  for(var outer = numlength; outer>=2; --outer) {
    for(var inner = 0; inner<=outer -1;inner ++) {
      if(data[inner] > data[inner + 1]){
        this.swap(this.dataStore, inner, inner+1)
      }
    }
  }
}
var aa= new CArray()
aa.bubbleSort()
console.log(aa.dataStore)複製程式碼

選擇排序

從陣列的開頭開始,將第一個元素和其他元素相比,最小的元素放在第一個位置,再從第二個位置開始

動畫演示

js實現資料結構及演算法之排序演算法

js實現

var CArray = function () {
  this.dataStore = [9,5,6,8,2,7,3,4,1]   //定義陣列
  this.swap = swap;      //數值交換位置
  this.selectSort = selectSort  //選擇排序
}
function swap(arr, index1, index2) {
  var temp = arr[index1]
  arr[index1] = arr[index2]
  arr[index2] = temp
}
function selectSort() {
  var min
  for(var outer = 0; outer < this.dataStore.length -2; ++outer) {
    min = outer
    for(var inner = outer +1; inner <= this.dataStore.length -1;  ++inner) {
      if(this.dataStore[inner] < this.dataStore[min]){
        min = inner
      }
    }
    this.swap(this.dataStore, outer,  min)
  }
}
var aa= new CArray()
aa.selectSort()
console.log(aa.dataStore)複製程式碼

插入排序

類似人們按數字或字母順序對資料進行排序,後面的要為前面的騰位置

動畫演示

js實現資料結構及演算法之排序演算法

js實現

var CArray = function () {
  this.dataStore = [9,5,6,8,2,7,3,4,1]   //定義陣列
  this.insertSort = insertSort  //插入排序
}
function insertSort() {
  var temp, inner
  for(var outer = 1; outer < this.dataStore.length; ++outer) {
    temp = this.dataStore[outer]
    inner = outer
    while(inner>0 && (this.dataStore[inner -1]) >= temp){
      this.dataStore[inner] = this.dataStore[inner -1]
      // console.log('inner->',this.dataStore)
      inner --
    }
    this.dataStore[inner] = temp
    // console.log('outer->',this.dataStore)
  }
}
var aa= new CArray()
aa.insertSort()
console.log(aa.dataStore)複製程式碼

希爾排序

它會首先比較較遠的元素而非相鄰的元素,讓元素儘快回到正確的位置。

通過定義一個間隔序列來表示在排序過程中進行的元素間隔。

公開的間隔序列是701,301,132,57,23,10,4,1

動畫演示

js實現資料結構及演算法之排序演算法

js實現

var CArray = function () {
  this.dataStore = [99,5,6,8,2,7,3,4,1,23,12,67,43,89]   //定義陣列
  this.shellSort = shellSort  //希爾排序
  this.gaps = [5,3,1]  //希爾間隔
  this.dynamiSort = dynamiSort //動態的希爾排序
  this.swap = swap;      //數值交換位置
}
function shellSort() {
  for(var g = 0; g < this.gaps.length; ++g) {
    for(var i = this.gaps[g]; i < this.dataStore.length; ++i) {
      var temp = this.dataStore[i]
      for(var j = i; j>=this.gaps[g] && this.dataStore[j - this.gaps[g]] > temp; j-=this.gaps[g]) {
        this.dataStore[j] = this.dataStore[j - this.gaps[g]]
      }
      this.dataStore[j] = temp
    }
    console.log('調換後-》', this.dataStore)
  }
}
//動態的希爾排序
function dynamiSort() {
  var N = this.dataStore.length
  var h = 1
  while(h < N/3) {
    h = h*3+1
  }
  while(h>=1) {
    for(var i = h; i < N; ++i) {
      for(var j = i; j>=h && this.dataStore[j] < this.dataStore[j - h] ; j-=h) {
        console.log(j)
        this.swap(this.dataStore, j,  j-h)
      }
    }
    console.log('調整後-》',this.dataStore)
    h = (h-1) / 3
  }
}
function swap(arr, index1, index2) {
  var temp = arr[index1]
  arr[index1] = arr[index2]
  arr[index2] = temp
}
var aa= new CArray()
// aa.shellSort()
 aa.dynamiSort()
console.log(aa.dataStore)複製程式碼

歸併排序

把一系列排好序的子序列合併成為一個大的完整有序序列

js實現資料結構及演算法之排序演算法

動畫演示

                 js實現資料結構及演算法之排序演算法

js實現

// 歸併排序
function mergeSort(arr) {
  var len = arr.length;
  if(len < 2) {
    return arr;
  }
  var middle = Math.floor(len / 2)
   var left = arr.slice(0, middle)
    var right = arr.slice(middle)
  return mergeArray(mergeSort(left), mergeSort(right));
}
//融合兩個有序陣列
function mergeArray(left, right) {
  var arr = []
  while(left.length && right.length) {
    if(left[0] > right[0]) {
      arr.push(right.shift())
    } else {
      arr.push(left.shift())
    }
  }
  return arr.concat(left, right)
}

var arr = [2,3,4,12,324,34,5,89,7654,8,9]

console.log(mergeSort(arr))複製程式碼

快速排序

在列表中選擇一個元素為基準值,排序圍繞這個基準值進行,將列表中小於基準值得放底部,大於的放頂部

動畫演示

js實現資料結構及演算法之排序演算法

js實現

// 快速排序
function qSort(list) {
  if( list.length === 0) return []
  var pivot = list[0]
  var lesser = []
  var greater = []
  for(var i = 1; i < list.length; i++) {
    if(list[i] < pivot) {
      lesser.push(list[i])
    } else {
      greater.push(list[i])
    }
  }
  return qSort(lesser).concat(pivot, qSort(greater))
}

var arr = [4,3,5,2]
console.log(qSort(arr))複製程式碼


相關文章