JS數據結構與算法-快速排序與二分查找算法

  1. 快速排序
    快速排序是處理大數據集最快的排序算法之一库菲。它是一種分而治之的算法呈队,通過遞歸的方式將數據依次分解為包含較小元素和較大元素的不同子序列枪蘑。該算法通過不斷重復這個步驟知道所有數據都是有序的。
  • 算法實現
    這個算法首先要在列表中選擇一個元素作為基準值(pivot)陆馁。數據排序圍繞基準值進行找颓,將列表中小于基準值的元素移到數組的底部(左邊),將大于基準值的元素移到數組的頂部(右邊)叮贩。

    ①選擇一個基準元素叮雳,將列表分成兩個子序列想暗;
    ②對列表重新排序,將所有小于基準值的元素放在基準值前面帘不,所有大于基準值的元素放在基準值的后面说莫;
    ③分別對較小的元素的子序列和較大元素的子序列重復步驟①和步驟②。

function qSort(list) {
    //檢查數組的長度是否為0寞焙,是則不需要任何排序储狭,返回空數組
    if(list.length == 0) {
        return [];
    }
    //創(chuàng)建兩個數組,一個用來存放比基準小的元素捣郊,另一個存放比基準值大的元素
    var left = [];
    var right = [];
    //基準值取自數組的第一個元素
    var pivot = list[0];
    //遍歷數組辽狈,根據它們與基準值的關系放到合適的數組中
    for(var i=1;i<list.length;i++) {
        if(list[i] < pivot) {
            left.push(list[i]);
        }else{
            right.push(list[i]);
        }
    }
    //然后對于較小的數組和較大的數組分別遞歸調用這個函數
    return qSort(left).concat(pivot,qSort(right));
}

var test = [4,3,5,1,2];

console.log(qSort(test)); //[1,2,3,4,5]

ps:遞歸的過程大概是這樣


靈魂畫手
  1. 二分法算法
    如果你要查找的數據是有序的,二分查找算法比順序查找算法更高效呛牲。
  • 算法理解
    二分搜索算法的原理和猜數字游戲類似刮萌,就是那個有人說“我正想著一個1到100的數字”的游戲。我們每回應一個數字娘扩,那個人就會說這個數字是高了着茸、低了還是對了。

  • 算法描述
    ①選擇中間值琐旁;
    ②如果選擇的值是待搜索的值涮阔,算法結束并返回;
    ③如果待搜索值比選中值要小灰殴,則返回步驟①并在選中值左邊的子數組中尋找敬特。
    ④如果待搜索值比選中值要大,則返回步驟①并在選中值右邊的子數組中尋找牺陶。

  • 算法實現

function binSearch(arr,data) {
    //將傳入的數組用快速排序算法排序一下
    var arr = qSort(arr);
    //將最后一個元素所在的位置設為上邊界
    var upperBound = arr.length-1;
    //將數組的第一個位置設為下邊界
    var lowerBound = 0;

    while(lowerBound <= upperBound) {
        //中點
        var mid = Math.floor((upperBound + lowerBound)/2);
        //如果待查詢的值大于中點元素伟阔,則將下邊界設置為中點元素所在下標加1,也就是選取數組的右半邊(不包括中點元素)掰伸,然后再在里面查找
        if(arr[mid] < data) {
            lowerBound = mid+1;
        //如果待查詢的值小于中點元素减俏,同理如上
        }else if(arr[mid] > data) {
            upperBound = mid-1;
        //否則如果相等,返回
        }else {
            return mid;
        }
    }
    return -1;
}

var test = [1,2,3,4,5,6];
console.log(binSearch(test,2)); //位置"1"

執(zhí)行步驟:

執(zhí)行步驟.png

參考學習

《數據結構與算法javascript描述》
《學習javascript數據結構與算法》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末碱工,一起剝皮案震驚了整個濱河市娃承,隨后出現的幾起案子,更是在濱河造成了極大的恐慌怕篷,老刑警劉巖历筝,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異廊谓,居然都是意外死亡梳猪,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來春弥,“玉大人呛哟,你說我怎么就攤上這事∧渑妫” “怎么了扫责?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長逃呼。 經常有香客問我鳖孤,道長,這世上最難降的妖魔是什么抡笼? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任苏揣,我火速辦了婚禮,結果婚禮上推姻,老公的妹妹穿的比我還像新娘平匈。我一直安慰自己,他們只是感情好藏古,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布增炭。 她就那樣靜靜地躺著,像睡著了一般校翔。 火紅的嫁衣襯著肌膚如雪弟跑。 梳的紋絲不亂的頭發(fā)上灾前,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天防症,我揣著相機與錄音,去河邊找鬼哎甲。 笑死蔫敲,一個胖子當著我的面吹牛,可吹牛的內容都是我干的炭玫。 我是一名探鬼主播奈嘿,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吞加!你這毒婦竟也來了裙犹?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤衔憨,失蹤者是張志新(化名)和其女友劉穎叶圃,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體践图,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡掺冠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了码党。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片德崭。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡斥黑,死狀恐怖,靈堂內的尸體忽然破棺而出眉厨,到底是詐尸還是另有隱情锌奴,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布缺猛,位于F島的核電站缨叫,受9級特大地震影響,放射性物質發(fā)生泄漏荔燎。R本人自食惡果不足惜耻姥,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望有咨。 院中可真熱鬧琐簇,春花似錦、人聲如沸座享。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渣叛。三九已至丈秩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間淳衙,已是汗流浹背蘑秽。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工骂蓖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留薄风,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓阿弃,卻偏偏與公主長得像靴跛,于是被迫代替她去往敵國和親缀雳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容