歸併排序的JavaScript實現

來源:互聯網
上載者:User

標籤:時間   lib   eof   []   10個   ===   use   nlogn   scan   

思想

這是一種分治演算法。將原始數組切分成較小的數組,直到每個小數組只有一項,然後在將小數組歸併為排好序的較大數組,直到最後得到一個排好序的最大數組。

代碼
function mergeSort(arr) {    const length = arr.length;    if (length === 1) { //遞迴演算法的停止條件,即為判斷數組長度是否為1        return arr;    }    const mid = Math.floor(length / 2);       const left = arr.slice(0,  mid);    const right = arr.slice(mid, length);      return merge(mergeSort(left), mergeSort(right)); //要將原始數組分割直至只有一個元素時,才開始歸併}function merge(left, right) {    const result = [];    let il = 0;    let ir = 0;    //left, right本身肯定都是從小到大排好序的    while( il < left.length && ir < right.length) {        if (left[il] < right[ir]) {            result.push(left[il]);            il++;        } else {            result.push(right[ir]);            ir++;        }            }    //不可能同時存在left和right都有剩餘項的情況, 要麼left要麼right有剩餘項, 把剩餘項加進來即可    while (il < left.length) {         result.push(left[il]);        il++;    }    while(ir < right.length) {        result.push(right[ir]);        ir++;    }    return result;}
效能分析
  • 時間複雜度:最好、平均、最壞O(nlogn)
  • 空間複雜度: O(n), 穩定
延伸:對比C語音的歸併排序
#include<stdio.h>#include<stdlib.h>void Merge(int *list,int *newlist,int s,int m,int t){    int i,j,k;    i=s;    j=m+1;    k=s;    while(i<=m&&j<=t)    {        if(list[i]<=list[j])        {            newlist[k]=list[i];            k++;            i++;        }        else        {            newlist[k]=list[j];            k++;            j++;        }    }    while(i<=m)//剩餘的若是前一個序列,則其直接按併入newlist    {        newlist[k]=list[i];        i++;        k++;    }    while(j<=t)    {        newlist[k]=list[j];        j++;        k++;    }}void MSort(int *list,int *newlist,int s,int t){    int *newlist2;    int m;    newlist2=(int *)malloc((t-s+1)*sizeof(int));//分配一個新數組,和list等長    if(s==t)    {        newlist[s]=list[s];    }    else    {        m=(s+t)/2;        MSort(list,newlist2,s,m);//將list[s]……list[m]遞迴歸併為有序的newlist2[s]……newlist2[m]        MSort(list,newlist2,m+1,t);//將list[m+1]……list[t]遞迴歸併為有序的newlist2[m+1]……newlist2[t]        Merge(newlist2,newlist,s,m,t);//將newlist2[s]……newlist2[m]和newlist2[m+1]……newlist2[t]歸併到newlist[s]……newlist[t]    }}void MergeSort(int *list,int *newlist,int n){    MSort(list,newlist,0,n-1);}main(){    int list[10],n=10,i,newlist[10];    printf("請輸入10個整數:\n");    for(i=0;i<10;i++)    {        scanf("%d",&list[i]);    }    MergeSort(list,newlist,10);    for(i=0;i<10;i++)    {        printf("%d",newlist[i]);    }    system("pause");}

歸併排序的JavaScript實現

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.