常見(jiàn)排序算法

  // 冒泡排序 每次將最小元素推至最前,效率較低霞赫,生產(chǎn)環(huán)境中很少使用显熏。
  function sort1(array) {
    var len = array.length,
        i,j,tmp;
    var result = array.slice(0);
    for(i=0;i<len;i++){
      for(j=len-1;j>i;j--){
        if(result[j]<result[j-1]){
          tmp = result[j];
          result[j] = result[j-1];
          result[j-1] = tmp;
        }
      }
    }
    return result;
  }

  // 改進(jìn)冒泡排序:
  // 如果在某次的排序中沒(méi)有出現(xiàn)交換的情況,
  // 那么說(shuō)明在無(wú)序的元素現(xiàn)在已經(jīng)是有序了,就可以直接返回了。
  function sort2(array) {
    var len = array.length,
    i, j, tmp, exchange, result;

    result = array.slice(0);
    for (i = 0; i < len; i++) {
      exchange = 0;
      for (j = len - 1; j > i; j--) {
        if (result[j] < result[j - 1]) {
          tmp = result[j];
          result[j] = result[j - 1];
          result[j - 1] = tmp;
          exchange = 1;
        }
      }
      if (!exchange) return result;
    }
    return result;
  }

  //選擇排序
  // 在無(wú)序區(qū)中選出最小的元素,然后將它和無(wú)序區(qū)的第一個(gè)元素交換位置。
  // 原理跟冒泡排序一樣区转,算是冒泡的衍生版本
  function sort3(array){
    var result = array.slice(0),
        len = array.length,
        i,j,k,tmp;
    for(i=0;i<len;i++){
      k = i;
      for(j=i+1;j<len;j++){
        if(result[j]<result[k]) k = j
      }
      if(k!==i){
        tmp = result[k];
        result[k] = result[i];
        result[i] = tmp;
      }
    }
    return result;
  }

  // 插入排序 從下標(biāo)1開(kāi)始每增1項(xiàng)排序一次,越往后遍歷次數(shù)越多,比冒泡和選擇排序有效率
  function sort4(array) {
    var len = array.length,
        i, j, tmp, result;

    // 設(shè)置數(shù)組副本
    result = array.slice(0);
    for(i=1; i < len; i++){
      tmp = result[i];
      j = i - 1;
      while(j>=0 && tmp < result[j]){
        result[j+1] = result[j];
        j--;
      }
      result[j+1] = tmp;
    }
    return result;
  }
 
  // 二分插入排序
  // 先在有序區(qū)通過(guò)二分查找的方法找到移動(dòng)元素的起始位置版扩,
  // 然后通過(guò)這個(gè)起始位置將后面所有的元素后移
  function sort5(array) {
    var len = array.length,
        i, j, tmp, low, high, mid, result;
    // 賦予數(shù)組副本
    result = array.slice(0);
    for(i = 1; i < len; i++){
      tmp = result[i];
      low = 0;
      high = i - 1;
      while(low <= high){
        mid = parseInt((low + high)/2, 10);
        if(tmp < result[mid]) high = mid - 1;
        else low = mid + 1;
      }
      for(j = i - 1; j >= high+1; j--){
        result[j+1] = result[j];            
      }
      result[j+1] = tmp;
    }
    return result;
  }

  // 合并排序
  // 前面三種排序算法只有教學(xué)價(jià)值废离,因?yàn)樾实停苌賹?shí)際使用礁芦。合并排序(Merge sort)則是一種被廣泛使用的排序方法蜻韭。
  // 它的基本思想是,將兩個(gè)已經(jīng)排序的數(shù)組合并宴偿,要比從頭開(kāi)始排序所有元素來(lái)得快湘捎。因此,可以將數(shù)組拆開(kāi)窄刘,分成n個(gè)只有一個(gè)元素的數(shù)組窥妇,然后不斷地兩兩合并,直到全部排序完成娩践。
  function sort6(array){
    var result = array.slice(0);

    // 遞歸調(diào)用合并函數(shù)
    function sort(arr){
      var mid = Math.floor(arr.length/2),
          left = arr.slice(0,mid),
          right = arr.slice(mid,arr.length);

      if(arr.length === 1){
        return arr;
      }

      return merge(sort(left),sort(right));
    }
    
    function merge(left,right){
      var result = [];
      while(left.length || right.length){
        if(left.length && right.length){
          if(left[0]<right[0]){
            result.push(left.shift())
          }else{
            result.push(right.shift())
          }
        }else if(left.length){
          result.push(left.shift())
        }else{
          result.push(right.shift())
        }
      }
      return result;
    }

    return sort(array);
  }

  // 快速排序(quick sort)是公認(rèn)最快的排序算法之一活翩,有著廣泛的應(yīng)用烹骨。
  //(1)在數(shù)據(jù)集之中,選擇一個(gè)元素作為"基準(zhǔn)"(pivot)材泄。
  //(2)所有小于"基準(zhǔn)"的元素沮焕,都移到"基準(zhǔn)"的左邊;所有大于"基準(zhǔn)"的元素拉宗,都移到"基準(zhǔn)"的右邊峦树。
  //(3)對(duì)"基準(zhǔn)"左邊和右邊的兩個(gè)子集,不斷重復(fù)第一步和第二步旦事,直到所有子集只剩下一個(gè)元素為止魁巩。
  function sort7(array){
    var tmp_array = array.slice(0),result;
    var quickSort = function(arr){
      var left = [],right = [];
      if(arr.length<=1) {return arr;}
      var pivotIndex = Math.floor(arr.length/2);
      var pivot = arr.splice(pivotIndex,1)[0];
      for(var i =0;i<arr.length;i++){
        if(arr[i]<pivot){
          left.push(arr[i])
        }else{
          right.push(arr[i])
        }
      }
      return quickSort(left).concat(pivot,quickSort(right))
      
    };
    result = quickSort(tmp_array);
    return result;
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市姐浮,隨后出現(xiàn)的幾起案子谷遂,更是在濱河造成了極大的恐慌,老刑警劉巖卖鲤,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肾扰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蛋逾,警方通過(guò)查閱死者的電腦和手機(jī)集晚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)换怖,“玉大人甩恼,你說(shuō)我怎么就攤上這事〕了蹋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵悦污,是天一觀的道長(zhǎng)铸屉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)切端,這世上最難降的妖魔是什么彻坛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮踏枣,結(jié)果婚禮上昌屉,老公的妹妹穿的比我還像新娘。我一直安慰自己茵瀑,他們只是感情好间驮,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著马昨,像睡著了一般竞帽。 火紅的嫁衣襯著肌膚如雪扛施。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天屹篓,我揣著相機(jī)與錄音疙渣,去河邊找鬼。 笑死堆巧,一個(gè)胖子當(dāng)著我的面吹牛妄荔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谍肤,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼懦冰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了谣沸?” 一聲冷哼從身側(cè)響起刷钢,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乳附,沒(méi)想到半個(gè)月后内地,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赋除,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年阱缓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片举农。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荆针,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出颁糟,到底是詐尸還是另有隱情航背,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布棱貌,位于F島的核電站玖媚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏婚脱。R本人自食惡果不足惜今魔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望障贸。 院中可真熱鬧错森,春花似錦、人聲如沸篮洁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嘀粱。三九已至激挪,卻和暖如春辰狡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背垄分。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工宛篇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人薄湿。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓叫倍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親豺瘤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吆倦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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