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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

javascript 实现快排 ,三向切分快排

發布時間:2025/3/18 javascript 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javascript 实现快排 ,三向切分快排 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

比如說對數組快排的思路就是:

  • 選取一個基準(可以選數組的開頭最為基準,令 i = 0 ;j = array.length -1)
  • 從arr[j]向前遍歷(j--),當該值大于基準,則交換,退出循環(break)。
  • 從arr[i]向后遍歷(i++),當該值大于基準,則交換,退出循環(break)。
  • 重復步驟2和步驟3,直到 i == j。此時a[i] 左邊都小于a[i],右邊都大于a[i]。
  • 根據下標分別遞歸左右兩邊的部分,注意一下遞歸出口就ok了。
  • /*** @author vigdxx@gmail.com* @param {Array} arr 待排序數組*/ function quickSort(arr) {/*** @description 對數組的一部分進行排序,快排的基準為取待排序部分首項* @param {Number} i 待排序部分開始位置* @param {Number} j 待排序部分結束位置*/function sort(i,j) {if(i >= j) {return} // 遞歸出口 let start = i;let end = j;while(i < j) {for(;j>i;j--) {if(arr[i] > arr[j]) {[arr[j],arr[i]] = [arr[i],arr[j]];break;} }// 這個地方用 ++i,可以少一次比較for(;i<j;++i) {if(arr[i] > arr[j]) {[arr[j],arr[i]] = [arr[i],arr[j]];break;} }}// 此時 i == j , arr[i] 左邊的小于等于 arr[i],右邊的大于arr[i]sort(start,i-1);sort(i+1,end)}sort(0,arr.length - 1);return arr; } 復制代碼

    快排的時間復雜度是 O(nlogn),是一種不穩定的排序算法。當出現 大量重復數據時 ,上述快排算法并不是一種最有解,他的改進型:三向切分快速排序是一種更高效的算法。其思想就是把一個數組分為三部分,一部分小于pivot,一部分等于pivot,還有一部分大于pivot。代碼如下

    function quickSort3way(arr) {function sort3way(low, high) {if(low >= high) {return}let lt = low;//小于pivot的元素交換點let gt = high;//大于pivot的元素交換點let i = low +1;let pivot = arr[low];while(i <= gt) {if (arr[i] < pivot) {[arr[i], arr[lt]] = [arr[lt], arr[i]];i++;lt++;} else if (arr[i] === pivot) {i++;} else if (arr[i] > pivot) {[arr[i], arr[gt]] = [arr[gt], arr[i]];gt--;//此時 不能i++,因為交換后不能保證 arr[i] 等于還是小于 pivot}}sort3way(low,lt-1);sort3way(gt+1,high);}sort3way(0,arr.length-1);return arr; } 復制代碼

    轉載于:https://juejin.im/post/5af69223f265da0b7b35fb7b

    總結

    以上是生活随笔為你收集整理的javascript 实现快排 ,三向切分快排的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。