氣泡排序
氣泡排序是最慢的排序演算法之一,資料值會像起跑一樣從陣列的一端漂浮到另一端
動畫演示
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實現
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實現
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實現
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實現
// 歸併排序
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實現
// 快速排序
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))複製程式碼