JS實現(xiàn)的排序算法

排序總結(jié)

一辛馆、冒泡排序

冒泡排序

算法描述如下:

  • 比較相鄰的元素俺陋。如果第一個比第二個大,就交換它們兩個;
  • 對每一對相鄰元素作同樣的工作腊状,從開始第一對到結(jié)尾的最后一對诱咏,這樣在最后的元素應(yīng)該會是最大的數(shù);
  • 針對所有的元素重復(fù)以上的步驟寿酌,除了最后一個胰苏;
  • 重復(fù)步驟1~3,直到排序完成醇疼。
    JavaScript代碼實現(xiàn):
function bubbleSort(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;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(bubbleSort(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]

二硕并、快速排序

快速排序

快速排序使用分治法來把一個串(list)分為兩個子串(sub-lists)。具體算法描述如下:

  • 從數(shù)列中挑出一個元素秧荆,稱為 "基準"(pivot)倔毙;
  • 重新排序數(shù)列,所有元素比基準值小的擺放在基準前面乙濒,所有元素比基準值大的擺在基準的后面(相同的數(shù)可以到任一邊)陕赃。在這個分區(qū)退出之后,該基準就處于數(shù)列的中間位置颁股。這個稱為分區(qū)(partition)操作么库;
  • 遞歸地(recursive)把小于基準值元素的子數(shù)列和大于基準值元素的子數(shù)列排序。
    Javascript代碼實現(xiàn):
//方法一甘有、運行時間較快
function quickSort1(arr){
        if(arr.length <=1){
            return arr;
        }
        var pivotIndex = Math.floor(arr.length/2);
        var pivot = arr.splice(pivotIndex,1)[0];//返回數(shù)組長度一半的元素作為基準
        var left=[];
        var right=[];
        for(var i=0; i < arr.length; i++){
            if(arr[i]<pivot){ //元素小于基準诉儒,push到左邊的數(shù)組
                left.push(arr[i]);
            }else{
                right.push(arr[i]) //元素大于基準,到右邊
            }
        }
        //把左右兩邊數(shù)組以及基準連起來
        return quickSort1(left).concat([pivot], quickSort1(right));
    }
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(quickSort1(arr));
//方法二
function quickSort2(array, left, right) { //left和right分別為數(shù)組的開始和結(jié)束位置
        if (Object.prototype.toString.call(array).slice(8, -1) === 'Array' 
&& typeof left) {   //判斷array是否為數(shù)組
            if (left < right) {
                var i = left - 1,
                    temp;
                for (var j = left; j <= right; j++) { 
                    if (array[j] <= array[right]) {
                        i++;
                        temp = array[i];
                        array[i] = array[j];
                        array[j] = temp;
                    }
                }
                quickSort2(array, left, i - 1);
                quickSort2(array, i + 1, right);

            }
            return array;
        } else {
            return 'array is not an Array or left or right is not a number!'
        }
    }
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(quickSort2(arr,0,arr.length-1));

三亏掀、選擇排序

選擇排序

每一次從待排序的數(shù)據(jù)元素中選出最谐婪础(或最大)的一個元素,存放在序列的起始位置滤愕,直到全部待排序的數(shù)據(jù)元素排完温算。

算法描述如下:

  • 初始狀態(tài):無序區(qū)為R[1..n],有序區(qū)為空间影;
  • 第i趟排序(i=1,2,3...n-1)開始時注竿,當前有序區(qū)和無序區(qū)分別為R[1..i-1]和R(i..n)。該趟排序從當前無序區(qū)中-選出關(guān)鍵字最小的記錄 R[k]魂贬,將它與無序區(qū)的第1個記錄R交換蔓搞,使R[1..i]和R[i+1..n)分別變?yōu)橛涗泜€數(shù)增加1個的新有序區(qū)和記錄個數(shù)減少1個的新無序區(qū);
  • n-1趟結(jié)束随橘,數(shù)組有序化了喂分。
    Javascript代碼實現(xiàn):
function selectionSort(arr) {
    var minIndex, temp;
    for (var i = 0; i < arr.length - 1; i++) {
        minIndex = i;
        for (var j = i + 1; j <arr.length; j++) {
            if (arr[j] < arr[minIndex]) {     //尋找最小的數(shù)
                minIndex = j;                 //將最小數(shù)的索引保存
            }
        }
        temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
    return arr;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(selectionSort(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]

四、插入排序

插入排序

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

  • 從第一個元素開始甘萧,該元素可以認為已經(jīng)被排序;
  • 取出下一個元素梆掸,在已經(jīng)排序的元素序列中從后向前掃描扬卷;
  • 如果該元素(已排序)大于新元素,將該元素移到下一位置酸钦;
  • 重復(fù)步驟3怪得,直到找到已排序的元素小于或者等于新元素的位置;
  • 將新元素插入到該位置后卑硫;
  • 重復(fù)步驟2~5徒恋。
    Javascript代碼實現(xiàn):
function insertionSort(array) {
    if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') {
        for (var i = 1; i < array.length; i++) {
            var key = array[i];
            var j = i - 1;
            while (j >= 0 && array[j] > key) {
                array[j + 1] = array[j];
                j--;
            }
            array[j + 1] = key;
        }
        return array;
    } else {
        return 'array is not an Array!';
    }
}

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市欢伏,隨后出現(xiàn)的幾起案子入挣,更是在濱河造成了極大的恐慌,老刑警劉巖硝拧,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件径筏,死亡現(xiàn)場離奇詭異,居然都是意外死亡障陶,警方通過查閱死者的電腦和手機滋恬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抱究,“玉大人恢氯,你說我怎么就攤上這事∠蔽” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵遏暴,是天一觀的道長侄刽。 經(jīng)常有香客問我,道長朋凉,這世上最難降的妖魔是什么州丹? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮杂彭,結(jié)果婚禮上墓毒,老公的妹妹穿的比我還像新娘。我一直安慰自己亲怠,他們只是感情好所计,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著团秽,像睡著了一般主胧。 火紅的嫁衣襯著肌膚如雪叭首。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天踪栋,我揣著相機與錄音焙格,去河邊找鬼。 笑死夷都,一個胖子當著我的面吹牛眷唉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播囤官,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼冬阳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了治拿?” 一聲冷哼從身側(cè)響起摩泪,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎劫谅,沒想到半個月后见坑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡捏检,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年荞驴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贯城。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡熊楼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出能犯,到底是詐尸還是另有隱情鲫骗,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布踩晶,位于F島的核電站执泰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏渡蜻。R本人自食惡果不足惜术吝,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茸苇。 院中可真熱鬧排苍,春花似錦、人聲如沸学密。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腻暮。三九已至幔翰,卻和暖如春漩氨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背遗增。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工叫惊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人做修。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓霍狰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饰及。 傳聞我的和親對象是個殘疾皇子蔗坯,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353