幾種算法

代碼雖源自抄襲蛔添,自己重寫時(shí)改了一下變量名卷员,消化更好了_

冒泡排序(Bubble Sort)

1. 算法步驟

  • 比較相鄰的元素。如果第一個(gè)比第二個(gè)大雷酪,就交換他們兩個(gè)捂龄。
  • 對(duì)每一對(duì)相鄰元素作同樣的工作释涛,從開(kāi)始第一對(duì)到結(jié)尾的最后一對(duì)。這步做完后倦沧,最后的元素會(huì)是最大的數(shù)唇撬。
  • 針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)刀脏。
  • 持續(xù)每次對(duì)越

2. 動(dòng)圖演示

3. JavaScript 代碼實(shí)現(xiàn)

function sort(arr){
    var len=arr.length;
    for(var i=0;i<len;i++){
        for(var j=0;j<len-1-i;j++){
            if(arr[j]>arr[j+1]){
                var temp=arr[j+1];
                arr[j+1]=arr[j];
                arr[j]=temp;
            }
            
        }
    }
    return arr;
}
console.log(sort([2,53,1,16,26]));

選擇排序(selectionSort)

選擇排序是一種簡(jiǎn)單直觀的排序算法局荚,無(wú)論什么數(shù)據(jù)進(jìn)去都是 O(n2) 的時(shí)間復(fù)雜度。所以用到它的時(shí)候愈污,數(shù)據(jù)規(guī)模越小越好耀态。唯一的好處可能就是不占用額外的內(nèi)存空間了吧。

1. 算法步驟

  • 首先在未排序序列中找到最性荼ⅰ(大)元素首装,存放到排序序列的起始位置
  • 再?gòu)氖S辔磁判蛟刂欣^續(xù)尋找最小(大)元素杭跪,然后放到已排序序列的末尾
  • 重復(fù)第二步仙逻,直到所有元素均排序完畢

2. 動(dòng)圖演示

function sort(arr){
    var len=arr.length;
    var minId,temp;
    for(var i=0;i<len-1;i++){
        minId=i;
        for(var j=i+1;j<len;j++){
            if(arr[j]<arr[minId]){
                minId=j;
            }
        }
        temp=arr[i];
        arr[i]=arr[minId];
        arr[minId]=temp;
    }
    return arr;
}
console.log(sort([2,5,3,1,4]));

插入排序

1. 算法步驟

  • 將第一待排序序列第一個(gè)元素看做一個(gè)有序序列,把第二個(gè)元素到最后一個(gè)元素當(dāng)成是未排序序列涧尿。
  • 從頭到尾依次掃描未排序序列系奉,將掃描到的每個(gè)元素插入有序序列的適當(dāng)位置。(如果待插入的元素與有序序列中的某個(gè)元素相等姑廉,則將待插入元素插入到相等元素的后面缺亮。)

2. 動(dòng)圖演示

3. JavaScript 代碼實(shí)現(xiàn)

function sort(arr){
    var len=arr.length;
    var sortedId,sortingValue;
    for(var i=1;i<len;i++){
        sortedId=i-1;
        sortingValue=arr[i];
        while(sortedId>=0 && arr[sortedId]>sortingValue){
            arr[sortedId+1]=arr[sortedId];//排序好的依次往后順移
            sortedId=sortedId-1;//
        }
        arr[sortedId+1]=sortingValue;//最后把在排序的值賦給已排好的順下一位
    }
    return arr;
}
console.log(sort([2,10,3,1,4]));

歸并排序(Merge sort)

1. 算法步驟

  • 申請(qǐng)空間,使其大小為兩個(gè)已經(jīng)排序序列之和桥言,該空間用來(lái)存放合并后的序列
  • 設(shè)定兩個(gè)指針萌踱,最初位置分別為兩個(gè)已經(jīng)排序序列的起始位置
  • 比較兩個(gè)指針?biāo)赶虻脑兀x擇相對(duì)小的元素放入到合并空間号阿,并移動(dòng)指針到下一位置
  • 重復(fù)步驟 3 直到某一指針達(dá)到序列尾
  • 將另一序列剩下的所有元素直接復(fù)制到合并序列尾

2. 動(dòng)圖演示

3. JavaScript 代碼實(shí)現(xiàn)

function sort(arr){
    var len=arr.length;
    if(len<2){
        return arr;
    }
    var middle=Math.floor(len / 2),
        left=arr.slice(0,middle),
        right=arr.slice(middle);
    return merge(sort(left),sort(right));
}
function merge(left,right){
    var result=[];
    while(left.length && right.length){
        if(left[0]<=right[0]){
            result.push(left.shift());
        }else{
            result.push(right.shift());
        }
    }
    while(left.length)
        result.push(left.shift());
    while(right.length)
        result.push(right.shift());
    return result;
}
console.log(sort([2,5,4,9,10,8,1]))

快速排序

1. 算法步驟

  • 從數(shù)列中挑出一個(gè)元素并鸵,稱為 “基準(zhǔn)”(pivot)
  • 重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面扔涧,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)园担。在這個(gè)分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個(gè)稱為分區(qū)(partition)操作
  • 遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序
  • 遞歸的最底部情形粉铐,是數(shù)列的大小是零或一疼约,也就是永遠(yuǎn)都已經(jīng)被排序好了。雖然一直遞歸下去蝙泼,但是這個(gè)算法總會(huì)退出程剥,因?yàn)樵诿看蔚牡╥teration)中,它至少會(huì)把一個(gè)元素?cái)[到它最后的位置去汤踏。

2. 動(dòng)圖演示

3. JavaScript 代碼實(shí)現(xiàn)

<!---表示還沒(méi)弄很懂织鲸,亂啊亂--->
function quickSort(arr, left, right) {
    var len = arr.length,
    partitionIndex,
    left = typeof left != 'number' ? 0 : left,
    right = typeof right != 'number' ? len - 1 : right;
    
    if (left < right) {
        partitionIndex = partition(arr, left, right);
        quickSort(arr, left, partitionIndex-1);
        quickSort(arr, partitionIndex+1, right);
    }
     return arr;
}
function partition(arr, left ,right) {     // 分區(qū)操作
    var pivot = left,                      // 設(shè)定基準(zhǔn)值(pivot)
    index = pivot + 1;
    for (var i = index; i <= right; i++) {
        if (arr[i] < arr[pivot]) {
            swap(arr, i, index);
            index++;
        }        
    }
    swap(arr, pivot, index - 1);
    return index-1;
}
function swap(arr, i, j) {
    var temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
function partition2(arr, low, high) {
    let pivot = arr[low];
    while (low < high) {
        while (low < high && arr[high] > pivot) {
            --high;
        }
        arr[low] = arr[high];
        while (low < high && arr[low] <= pivot) {
            ++low;
        }
        arr[high] = arr[low];
    }
    arr[low] = pivot;
    return low;
}
function quickSort2(arr, low, high) {
    if (low < high) {
        let pivot = paritition2(arr, low, high);
        quickSort2(arr, low, pivot - 1);
        quickSort2(arr, pivot + 1, high);
    }
    return arr;
}
console.log(quickSort([5,4,2,1,3,99]));

借來(lái)同學(xué)一個(gè)快速排序溪胶,很簡(jiǎn)潔

快速排序又稱為自私算法搂擦,它優(yōu)先讓每個(gè)元素找到自己所在的位置,每次排序都實(shí)現(xiàn)“比我大的都在我右邊哗脖,比我小的都在我左邊”而不去計(jì)較它們的位置關(guān)系瀑踢。具體做法為:先找一個(gè)基準(zhǔn)點(diǎn)(一般用第一個(gè)元素或者中間元素)然后數(shù)組被分為兩部分,如果選定值比它小才避,放左邊橱夭;比它大,放右邊桑逝。然后進(jìn)行反復(fù)比較棘劣,就可以實(shí)現(xiàn)效果。

function sort(array){
    if(array.length<=1){
        return array;
    }
    var len = Math.floor(array.length/2);
    var cur = array.splice(len,1);
    var left = [];
    var right = [];
    for(var i=0;i<array.length;i++){
        if(cur>array[i]){
            left.push(array[i]);
        }else{
            right.push(array[i]);
        }
    }
    return sort(left).concat(cur,sort(right));
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末楞遏,一起剝皮案震驚了整個(gè)濱河市茬暇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寡喝,老刑警劉巖糙俗,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異预鬓,居然都是意外死亡臼节,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門珊皿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人巨税,你說(shuō)我怎么就攤上這事蟋定。” “怎么了草添?”我有些...
    開(kāi)封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵驶兜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)抄淑,這世上最難降的妖魔是什么屠凶? 我笑而不...
    開(kāi)封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮肆资,結(jié)果婚禮上矗愧,老公的妹妹穿的比我還像新娘。我一直安慰自己郑原,他們只是感情好唉韭,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著犯犁,像睡著了一般属愤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酸役,一...
    開(kāi)封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天住诸,我揣著相機(jī)與錄音,去河邊找鬼涣澡。 笑死贱呐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的暑塑。 我是一名探鬼主播吼句,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼事格!你這毒婦竟也來(lái)了惕艳?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤驹愚,失蹤者是張志新(化名)和其女友劉穎远搪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體逢捺,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谁鳍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了劫瞳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倘潜。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖志于,靈堂內(nèi)的尸體忽然破棺而出涮因,到底是詐尸還是另有隱情,我是刑警寧澤伺绽,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布养泡,位于F島的核電站嗜湃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏澜掩。R本人自食惡果不足惜购披,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肩榕。 院中可真熱鬧刚陡,春花似錦、人聲如沸点把。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)郎逃。三九已至哥童,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間褒翰,已是汗流浹背贮懈。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留优训,地道東北人朵你。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像揣非,于是被迫代替她去往敵國(guó)和親抡医。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)早敬。 張土汪:刷leetcod...
    土汪閱讀 12,724評(píng)論 0 33
  • 某次二面時(shí)忌傻,面試官問(wèn)起Js排序問(wèn)題,吾絞盡腦汁回答了幾種搞监,深感算法有很大的問(wèn)題水孩,所以總計(jì)一下! 排序算法說(shuō)明 (1...
    流浪的先知閱讀 1,187評(píng)論 0 4
  • Ba la la la ~ 讀者朋友們琐驴,你們好啊俘种,又到了冷鋒時(shí)間,話不多說(shuō)绝淡,發(fā)車宙刘! 1.冒泡排序(Bub...
    王飽飽閱讀 1,788評(píng)論 0 7
  • 文/圖 娜朵 適度的焦慮有助于人們提高效率 但焦慮過(guò)度就需要治療了 但在一線大城市 身不由己的,讓人開(kāi)始忙碌起來(lái)...
    水彩后的娜朵閱讀 325評(píng)論 0 4
  • 很久很久以前牢酵,只有默默和沐沐荐类,她們也會(huì)因?yàn)閷W(xué)業(yè),生活茁帽,和感情感到疲憊玉罐,她們總是相互依偎,因?yàn)樗齻冎乐挥袑?duì)方才會(huì)是...
    溫儀閱讀 252評(píng)論 1 3