JavaScript實現的幾種排序

2021-08-21 02:19:52 字數 3401 閱讀 6625

原理:氣泡排序的過程就是將陣列中相鄰的兩個元素進行比較,如果前面的元素比後面的元素要大交換位置,否則位置不變;舉個栗子:有陣列 arr = [3,5,4,2,1];

第一輪迴圈:3和5比較,3小於5兩者位置不變,接下來5和4比較,5大於4,兩者交換位置,接著5和2比較,5>2兩者交換位置,繼續5和1 比較 5>1兩者交換位置,一輪後得到的陣列是[3,4,2,1,5];把大的元素放到陣列的最末尾,這種就像水泡樣一層一層的像後移動,就是氣泡排序了;

**實現:

// 記錄迴圈次數

let count = 0

// 位置交換函式

const change = function (arr, n1, n2)

// 氣泡排序

const bubblesort = function (soucre) }}

return soucre

}//驗證

console.log(bubblesort([3,6,2,4,9,1,8])) // [1,2,3,4,6,8,9]

console.log(count) // 21

選擇排序和氣泡排序類似也是依次對相鄰的數進行兩兩比較。不同之處在於,他不是每次兩兩相鄰比較後交換位置,他是先找出最大(最小)將它放到正確的位置,然後再尋找次最大(最小)放在正確的位置;

舉個栗子:有陣列 arr = [3,5,4,2,1];

先假設第乙個元素是最小值,並定義乙個minidx=0變數記錄最小(最大)值的位置,for迴圈和其他元素進行比較,3和5進行比較,5>3此時不做處理,4也是一樣處理,當3和2比較時,3>2,此時將minidx賦值為2的位置,接下來用arr[minidx]和剩餘的元素比較遇到比他小的就用minidx記錄小值的位置;最後將最小的位置值和初始給的值位置進行互換(當然是初始的值和一輪迴圈下來的minidx位置不一樣才互換);所以一輪迴圈下來結果是arr = [1,5,4,2,3]

**實現:

// 記錄迴圈次數

let count = 0

// 選擇排序

const selectsort = function (soucre)

}if (minidx !== i)

}return soucre

}console.log(selectsort([3,6,2,4,9,1,8,23,45,16,14])) // [1, 2, 3, 4, 6, 8, 9, 14, 16, 23, 45]

console.log(count) // 55

原理:將陣列分為已排序和未排序,將第乙個元素看作是已排序的元素,而其他是未排序的,從未排序的裡面取出一元素和已排序元素進行比較,並插入到正確位置,這樣已排序部分增加乙個元素,而未排序的部分減少乙個元素。直到排序完成

舉個栗子:有陣列 arr = [1,5,4,2,3],第一次假設元素1 是已排序部分,5,4,2,3為未排序,取出元素5加入已排序部分,5>1,已排序部分為1,5;而未排序部分為4,2,3;如此往復完成排序;

**實現:

const insertsort = function (source) 

source[j+1] = value

}return

source

}console.log(insertsort([3,6,2,4,9,1,8])) // [1,2,3,4,6,8,9]

原理: 將兩個已經排序的陣列合併,要比從頭開始排序所有元素來得快。因此,可以將陣列拆開,分成n個只有乙個元素的陣列,然後不斷地兩兩合併,直到全部排序完成

**實現:

const mergesort = function

mergesort

(source)

let mid = math.floor(len/2)

letleft = source.slice(0,mid)

letright = source.slice(mid)

return merge(mergesort(left), mergesort(right))

}function

merge

(left, right) else

}while (left.length)

while (right.length)

return result

}console.log(mergesort([4,8,1,3,5,9,6])) // [1,3,4,5,6,8,9]

原理:快速排序是目前公認的速度快高效的排序方式,時間複雜度o(nlogn)是比較理想的狀態,他的實現過程是,先在陣列找到乙個基點,把大於這個基點的值放到右側,小於基點的值放到左側,再將右側的和左側的也按照這種方式再次分配,直到完成排序

舉個栗子:有乙個陣列 arr = [1,5,4,2,3];假設我們找陣列的中間點作為基點也就是4,那一輪迴圈後結果就是[1,2,3,4,5] ->_->怎麼這麼巧,一輪就ok,果然是快速排序,就是快 哈哈,當然程式不會這麼做,他是嚴謹的,他還會去分[1,2,3]只是這個實際上已經是排好了的;

**實現:粗糙一點的

const quire = function quire(source)  else

if (source[i] > key)

}return .concat(quire(left),key,quire(right))

}

上面這種方法缺點就是空間浪費,他會建立很多個left 和 right 這樣的陣列,造成空間的浪費,當資料量一大的話還是很恐怖的,所以我們要改進的就是,不新建中間陣列,而是直接修改位移目標陣列;

改進原理: 選取乙個基點,從陣列的兩頭兩個指標分別向基點位移,位移的原則是,基點的左邊的元素如果小於基點,那就像基點位置靠攏以為i++,如果大於基點就原地不動,基點右邊的元素反過來,如果大於基點就像基點靠攏一位,j--;如果小於就原地不動;這時再比較兩個原地不動的點,如果右邊的不動點小於左邊的值,叫互換他們的位置;

**實現:

// 位置交換

const change = function (arr, n1, n2)

const quiregai = function quiregai(source, start, end)

while (source[j] > pivot)

if (i <= j)

}return i // 返回一輪迴圈後左指標的位置,為下一輪迴圈初始位置確定

}const quiregaisort = function quiregaisort(source, start, end)

if (nextstart < end)

return

source

}console.log(quiregaisort([4,1,9,3,7,5,76,21,12,53,24]))

javascript實現繼承的幾種方式

前言 js作為物件導向的弱型別語言,繼承也是其非常強大的特性之一。那麼如何在js中實現繼承呢?讓我們拭目以待。既然要實現繼承,那麼首先我們得有乙個父類,如下 定義乙個動物類 function animal name 原型方法 animal.prototype.eat function food 核心...

javascript實現繼承的幾種主要方法

1.原型鏈繼承 var supclass function name,supclass.prototype var sonclass function name,console.log sonclass.prototype sonclass.prototype new supclass 核心 son...

javascript實現繼承的幾種主要方法

1.原型鏈繼承 var supclass function name,supclass.prototype var sonclass function name,console.log sonclass.prototype sonclass.prototype new supclass 核心 son...