幾種排序算法

1.冒泡排序

function bubbleSort(arr){
  for(var i =0 ;i < arr.length; i++){
    for(var j = i+1; j < arr.length - 1; j++){
      if(arr[i] > arr[j]){
        var temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
      }
    }
  }
  return arr;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(bubbleSort(arr));

改進(jìn)冒泡排序: 設(shè)置一標(biāo)志性變量pos,用于記錄每趟排序中最后一次進(jìn)行交換的位置锨络。由于pos位置之后的記錄均已交換到位,故在進(jìn)行下一趟排序時(shí)只要掃描到pos位置即可输拇。

function bubbleSort(arr){
  var i = arr.length-1;
  while(i>0){
    var pos = 0;
    for(var j = 0; j < i; j++){
      if(arr[j] > arr[j+1]){
        pos = j;
        var temp = arr[j];
        arr[j] = arr[j+1];
        arr[j+1] = temp;
      }
    }
    i = pos;
  }
  return arr;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(bubbleSort(arr));

傳統(tǒng)冒泡排序中每一趟排序操作只能找到一個(gè)最大值或最小值,我們考慮利用在每趟排序中進(jìn)行正向和反向兩遍冒泡的方法一次可以得到兩個(gè)最終值(最大者和最小者) , 從而使排序趟數(shù)幾乎減少了一半闯睹。

function bubbleSort(arr){
  var low = 0,
      hight = arr.length - 1;
  var tmp,j;
  while(low < hight){
    for(j = low; j < hight; ++j){
      if(arr[j] > arr[j+1]){
        tmp = arr[j];
        arr[j] = arr[j+1];
        arr[j+1] = tmp;
      }
    }
    --hight;
    for(j = hight; j > low; --j){
      if(arr[j] < arr[j-1]){
        tmp = arr[j];
        arr[j] = arr[j-1];
        arr[j-1] = tmp;
      }
    }
    ++low;
  }
  return arr;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(bubbleSort(arr));

算法分析

  • 最佳情況:T(n) = O(n)
    當(dāng)輸入的數(shù)據(jù)已經(jīng)是正序時(shí)
  • 最差情況:T(n) = O(n^2)
    當(dāng)輸入的數(shù)據(jù)是反序時(shí)
  • 平均情況:T(n) = O(n^2)

2.選擇排序

(1)算法簡(jiǎn)介

選擇排序(Selection-sort)是一種簡(jiǎn)單直觀的排序算法休玩。它的工作原理:首先在未排序序列中找到最蓄蹰埂(大)元素铝宵,存放到排序序列的起始位置首懈,然后翎冲,再?gòu)氖S辔磁判蛟刂欣^續(xù)尋找最写共恰(大)元素,然后放到已排序序列的末尾府适。以此類推羔飞,直到所有元素均排序完畢。

(2)算法描述和實(shí)現(xiàn)

n個(gè)記錄的直接選擇排序可經(jīng)過n-1趟直接選擇排序得到有序結(jié)果檐春。具體算法描述如下:

<1>.初始狀態(tài):無序區(qū)為R[1..n]逻淌,有序區(qū)為空;
<2>.第i趟排序(i=1,2,3…n-1)開始時(shí)疟暖,當(dāng)前有序區(qū)和無序區(qū)分別為R[1..i-1]和R(i..n)卡儒。該趟排序從當(dāng)前無序區(qū)中-選出關(guān)鍵字最小的記錄 R[k]田柔,將它與無序區(qū)的第1個(gè)記錄R交換,使R[1..i]和R[i+1..n)分別變?yōu)橛涗泜€(gè)數(shù)增加1個(gè)的新有序區(qū)和記錄個(gè)數(shù)減少1個(gè)的新無序區(qū)骨望;
<3>.n-1趟結(jié)束硬爆,數(shù)組有序化了。

function selectionSort(arr){
  var len = arr.length;
  var tmp,minIndex;
  for(var i = 0; i < len - 1; i++){
    minIndex = i;
    for(var j = i + 1;j < len ;j++){
      if(arr[j] < arr[minIndex]){
        minIndex = j;
      }
    }
    tmp = arr[i];;
    arr[i] = arr[minIndex];
    arr[minIndex] = tmp;
  }
  return arr;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(selectionSort(arr));

(3)算法分析

  • 最佳情況:T(n) = O(n^2)
  • 最差情況:T(n) = O(n^2)
  • 平均情況:T(n) = O(n^2)

3.插入排序

(1)算法簡(jiǎn)介

插入排序(Insertion-Sort)的算法描述是一種簡(jiǎn)單直觀的排序算法擎鸠。它的工作原理是通過構(gòu)建有序序列缀磕,對(duì)于未排序數(shù)據(jù),在已排序序列中從后向前掃描劣光,找到相應(yīng)位置并插入袜蚕。插入排序在實(shí)現(xiàn)上,通常采用in-place排序(即只需用到O(1)的額外空間的排序)绢涡,因而在從后向前掃描過程中牲剃,需要反復(fù)把已排序元素逐步向后挪位,為最新元素提供插入空間雄可。

(2)算法描述和實(shí)現(xiàn)

一般來說凿傅,插入排序都采用in-place在數(shù)組上實(shí)現(xiàn)。具體算法描述如下:

<1>.從第一個(gè)元素開始数苫,該元素可以認(rèn)為已經(jīng)被排序聪舒;
<2>.取出下一個(gè)元素,在已經(jīng)排序的元素序列中從后向前掃描文判;
<3>.如果該元素(已排序)大于新元素过椎,將該元素移到下一位置;
<4>.重復(fù)步驟3戏仓,直到找到已排序的元素小于或者等于新元素的位置疚宇;
<5>.將新元素插入到該位置后;
<6>.重復(fù)步驟2~5赏殃。

function insertionSort(arr){
  for(var i = 1; i < arr.length; i ++){
    var k = arr[i];
    var j = i - 1; 
    while(j >= 0 && arr[j] > k){
      arr[j+1] = arr[j];
      j--;
    }
    arr[j+1] = k;
  }
  return arr;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log( insertionSort(arr));

改進(jìn)插入排序: 查找插入位置時(shí)使用二分查找的方式

function sort(arr){
  for(var i = 1; i < arr.length; i ++){
    var k = arr[i];
    var left = 0,
        right = i - 1;
    while(left <= right){
      var middle = parseInt((right + left) / 2);
      if(k < arr[middle]){
        right = middle - 1;
      }else{
        left = middle + 1;
      }
    }
    for(var j = i - 1;j >= left; j--){
      arr[j+1] = arr[j];
    }
    arr[left] = k;
  }
  return arr;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(sort(arr));

(3)算法分析

  • 最佳情況:輸入數(shù)組按升序排列敷待。T(n) = O(n)
  • 最壞情況:輸入數(shù)組按降序排列。T(n) = O(n^2)
  • 平均情況:T(n) = O(n^2)

4.歸并排序

(1)算法簡(jiǎn)介

歸并排序是建立在歸并操作上的一種有效的排序算法仁热。該算法是采用分治法(Divide and Conquer)的一個(gè)非常典型的應(yīng)用榜揖。歸并排序是一種穩(wěn)定的排序方法。將已有序的子序列合并抗蠢,得到完全有序的序列举哟;即先使每個(gè)子序列有序,再使子序列段間有序迅矛。若將兩個(gè)有序表合并成一個(gè)有序表妨猩,稱為2-路歸并。

(2)算法描述和實(shí)現(xiàn)

具體算法描述如下:

<1>.把長(zhǎng)度為n的輸入序列分成兩個(gè)長(zhǎng)度為n/2的子序列秽褒;
<2>.對(duì)這兩個(gè)子序列分別采用歸并排序壶硅;
<3>.將兩個(gè)排序好的子序列合并成一個(gè)最終的排序序列威兜。

function mergeSort(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(mergeSort(left),mergeSort(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;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(mergeSort(arr));

(3)算法分析

  • 最佳情況:T(n) = O(n)
  • 最差情況:T(n) = O(nlogn)
  • 平均情況:T(n) = O(nlogn)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市庐椒,隨后出現(xiàn)的幾起案子椒舵,更是在濱河造成了極大的恐慌,老刑警劉巖约谈,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笔宿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡窗宇,警方通過查閱死者的電腦和手機(jī)措伐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門特纤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來军俊,“玉大人,你說我怎么就攤上這事捧存》喙” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵昔穴,是天一觀的道長(zhǎng)镰官。 經(jīng)常有香客問我,道長(zhǎng)吗货,這世上最難降的妖魔是什么泳唠? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮宙搬,結(jié)果婚禮上笨腥,老公的妹妹穿的比我還像新娘。我一直安慰自己勇垛,他們只是感情好脖母,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著闲孤,像睡著了一般谆级。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讼积,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天肥照,我揣著相機(jī)與錄音,去河邊找鬼勤众。 笑死舆绎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的决摧。 我是一名探鬼主播亿蒸,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼凑兰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了边锁?” 一聲冷哼從身側(cè)響起姑食,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茅坛,沒想到半個(gè)月后音半,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贡蓖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年曹鸠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斥铺。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彻桃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晾蜘,到底是詐尸還是另有隱情邻眷,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布剔交,位于F島的核電站肆饶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏岖常。R本人自食惡果不足惜驯镊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望竭鞍。 院中可真熱鬧板惑,春花似錦、人聲如沸笼蛛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滨砍。三九已至往湿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惋戏,已是汗流浹背领追。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留响逢,地道東北人绒窑。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像舔亭,于是被迫代替她去往敵國(guó)和親些膨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蟀俊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

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

  • 該篇文章主要介紹了算法基礎(chǔ)以及幾種常見的排序算法:選擇排序、插入排序订雾、冒泡排序肢预、快速排序、堆排序洼哎。 一烫映、算法基礎(chǔ) ...
    ZhengYaWei閱讀 1,249評(píng)論 0 12
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序噩峦,而外部排序是因排序的數(shù)據(jù)很大锭沟,一次不能容納全部...
    蟻前閱讀 5,170評(píng)論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序识补,而外部排序是因排序的數(shù)據(jù)很大族淮,一次不能容納全部...
    每天刷兩次牙閱讀 3,729評(píng)論 0 15
  • 我一直覺得寫代碼也可以寫出藝術(shù),在不懂畫的人的眼里李请,《向日葵》不過是小孩子的涂鴉瞧筛,在懂代碼的人眼里,那看似混亂的字...
    AidenRao閱讀 4,149評(píng)論 9 59
  • 一. 寫在前面 要學(xué)習(xí)算法导盅,“排序”是一個(gè)回避不了的重要話題,在分析完并查集算法和常用數(shù)據(jù)結(jié)構(gòu)之后揍瑟,今天我們終于可...
    Leesper閱讀 2,526評(píng)論 0 40