日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

javascript-排序算法

發(fā)布時(shí)間:2023/12/13 javascript 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javascript-排序算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

插入排序

算法描述:?
1. 從第一個(gè)元素開始,該元素可以認(rèn)為已經(jīng)被排序?
2. 取出下一個(gè)元素,在已經(jīng)排序的元素序列中從后向前掃描?
3. 如果該元素(已排序)大于新元素,將該元素移到下一位置?
4. 重復(fù)步驟 3,直到找到已排序的元素小于或者等于新元素的位置?
5. 將新元素插入到該位置后?
6. 重復(fù)步驟 2~5

現(xiàn)有一組數(shù)組 arr = [5, 6, 3, 1, 8, 7, 2, 4]

[5] 6 3 1 8 7 2 4 //第一個(gè)元素被認(rèn)為已經(jīng)被排序[5,6] 3 1 8 7 2 4 //6與5比較,放在5的右邊[3,5,6] 1 8 7 2 4 //3與6和5比較,都小,則放入數(shù)組頭部[1,3,5,6] 8 7 2 4 //1與3,5,6比較,則放入頭部[1,3,5,6,8] 7 2 4[1,3,5,6,7,8] 2 4[1,2,3,5,6,7,8] 4[1,2,3,4,5,6,7,8]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

編程思路:雙層循環(huán),外循環(huán)控制未排序的元素,內(nèi)循環(huán)控制已排序的元素,將未排序元素設(shè)為標(biāo)桿,與已排序的元素進(jìn)行比較,小于則交換位置,大于則位置不動(dòng)

function insertSort(arr){var tmp;for(var i=1;i<arr.length;i++){tmp = arr[i];for(var j=i;j>=0;j--){if(arr[j-1]>tmp){arr[j]=arr[j-1];}else{arr[j]=tmp;break;}}}return arr }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

時(shí)間復(fù)雜度O(n^2)

選擇排序

算法描述:直接從待排序數(shù)組中選擇一個(gè)最小(或最大)數(shù)字,放入新數(shù)組中。

[1] 5 6 3 8 7 2 4 [1,2] 5 6 3 8 7 4 [1,2,3] 5 6 8 7 2 4 [1,2,3,4] 5 6 8 7 [1,2,3,4,5] 6 8 7 [1,2,3,4,5,6] 8 7 [1,2,3,4,5,6,7] 8 [1,2,3,4,5,6,7,8]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

編程思路:先假設(shè)第一個(gè)元素為最小的,然后通過循環(huán)找出最小元素,然后同第一個(gè)元素交換,接著假設(shè)第二個(gè)元素,重復(fù)上述操作即可

function selectionSort(array) {var length = array.length,i,j,minIndex,minValue,temp;for (i = 0; i < length - 1; i++) {minIndex = i;minValue = array[minIndex];for (j = i + 1; j < length; j++) {//通過循環(huán)選出最小的if (array[j] < minValue) {minIndex = j;minValue = array[minIndex];}}// 交換位置temp = array[i];array[i] = minValue;array[minIndex] = temp;}return array }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

時(shí)間復(fù)雜度O(n^2)

歸并排序

算法描述:?
1. 把 n 個(gè)記錄看成 n 個(gè)長(zhǎng)度為 l 的有序子表?
2. 進(jìn)行兩兩歸并使記錄關(guān)鍵字有序,得到 n/2 個(gè)長(zhǎng)度為 2 的有序子表?
3. 重復(fù)第 2 步直到所有記錄歸并成一個(gè)長(zhǎng)度為 n 的有序表為止。

5 6 3 1 8 7 2 4[5,6] [3,1] [8,7] [2,4][5,6] [1,3] [7,8] [2,4][5,6,1,3] [7,8,2,4][1,3,5,6] [2,4,7,8][1,2,3,4,5,6,7,8]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

編程思路:將數(shù)組一直等分,然后合并

function merge(left, right) {var tmp = [];while (left.length && right.length) {if (left[0] < right[0])tmp.push(left.shift());elsetmp.push(right.shift());}return tmp.concat(left, right); }function mergeSort(a) {if (a.length === 1) return a;var mid = Math.floor(a.length / 2), left = a.slice(0, mid), right = a.slice(mid);return merge(mergeSort(left), mergeSort(right)); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

時(shí)間復(fù)雜度O(nlogn)

快速排序

算法描述:

  • 在數(shù)據(jù)集之中,選擇一個(gè)元素作為”基準(zhǔn)”(pivot)。
  • 所有小于”基準(zhǔn)”的元素,都移到”基準(zhǔn)”的左邊;所有大于”基準(zhǔn)”的元素,都移到”基準(zhǔn)”的右邊。這個(gè)操作稱為分區(qū) (partition)操作,分區(qū)操作結(jié)束后,基準(zhǔn)元素所處的位置就是最終排序后它的位置。
  • 對(duì)”基準(zhǔn)”左邊和右邊的兩個(gè)子集,不斷重復(fù)第一步和第二步,直到所有子集只剩下一個(gè)元素為止。
  • 5 6 3 1 8 7 2 4pivot | 5 6 3 1 9 7 2 4 | storeIndex5 6 3 1 9 7 2 4//將5同6比較,大于則不更換 | storeIndex3 6 5 1 9 7 2 4//將5同3比較,小于則更換|storeIndex3 6 1 5 9 7 2 4//將5同1比較,小于則不更換|storeIndex ...3 6 1 4 9 7 2 5//將5同4比較,小于則更換|storeIndex3 6 1 4 5 7 2 9//將標(biāo)準(zhǔn)元素放到正確位置| storeIndex pivot
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    上述講解了分區(qū)的過程,然后就是對(duì)每個(gè)子區(qū)進(jìn)行同樣做法

    function quickSort(arr){if(arr.length<=1) return arr;var partitionIndex=Math.floor(arr.length/2);var tmp=arr[partitionIndex];var left=[];var right=[];for(var i=0;i<arr.length;i++){if(arr[i]<tmp){left.push(arr[i])}else{right.push(arr[i])}}return quickSort(left).concat([tmp],quickSort(right)) }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    上述版本會(huì)造成堆棧溢出,所以建議使用下面版本

    原地分區(qū)版:主要區(qū)別在于先進(jìn)行分區(qū)處理,將數(shù)組分為左小右大

    function quickSort(arr){function swap(arr,right,left){var tmp = arr[right];arr[right]=arr[left];arr[left]=tmp;}function partition(arr,left,right){//分區(qū)操作,var pivotValue=arr[right]//最右面設(shè)為標(biāo)準(zhǔn)var storeIndex=left;for(var i=left;i<right;i++){if(arr[i]<=pivotValue){swap(arr,storeIndex,i);storeIndex++;}}swap(arr,right,storeIndex);return storeIndex//返回標(biāo)桿元素的索引值}function sort(arr,left,right){if(left>right) return;var storeIndex=partition(arr,left,right);sort(arr,left,storeIndex-1);sort(arr,storeIndex+1,right);}sort(arr,0,arr.length-1);return arr; }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    時(shí)間復(fù)雜度O(nlogn)

    冒泡排序

    算法描述:?
    1. 比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。?
    2. 對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì)。在這一點(diǎn),最后的元素應(yīng)該會(huì)是最大的數(shù)。?
    3. 針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。?
    4. 持續(xù)每次對(duì)越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。5.

    5 6 3 1 8 7 2 4[5 6] 3 1 8 7 2 4 //比較5和65 [6 3] 1 8 7 2 45 3 [6 1] 8 7 2 45 3 1 [6 8] 7 2 45 3 1 6 [8 7] 2 45 3 1 6 7 [8 2] 45 3 1 6 7 2 [8 4]5 3 1 6 7 2 4 8 // 這樣最后一個(gè)元素已經(jīng)在正確位置,所以下一次開始時(shí)候就不需要再比較最后一個(gè)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    編程思路:外循環(huán)控制需要比較的元素,比如第一次排序后,最后一個(gè)元素就不需要比較了,內(nèi)循環(huán)則負(fù)責(zé)兩兩元素比較,將元素放到正確位置上

    function bubbleSort(arr){var len=arr.length;for(var i=len-1;i>0;i--){for(var j=0;j<i;j++){if(arr[j]<arr[j+1]){var tmp = arr[j];arr[j]=arr[j+1];arr[j+1]=tmp}}}return arr; }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    時(shí)間復(fù)雜度O(n^2)

    參考資料

    排序效果?
    常見排序算法?
    排序算法 維基百科

    總結(jié)

    以上是生活随笔為你收集整理的javascript-排序算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。