歸并排序-nlogn

//歸并排序

void mergeArray(int a[], int first, int mid, int last, int temp[]) //對(duì)兩個(gè)有序數(shù)列合并

{

   int i = first;

   int j = mid + 1;

   int m = mid;

   int n = last;

   int k = 0;

 

 //每次把兩個(gè)數(shù)列中較小的值存在temp中

   while(i <= m && j <= n)

   {

     if(a[i]<= a[j])

     {

       temp[k++] = a[i++];

     }

     else

     {

       temp[k++] = a[j++];

     }

   }

 //哪一個(gè)數(shù)列先完成拷貝就把另一個(gè)數(shù)列的剩余的值存在temp中

   while(i <= m)

   {

     temp[k++] = a[i++];

   }

   while(j <= n)

   {

     temp[k++] = a[j++];

   }

 

 //把temp中的值拷貝到a中

   for(int i = 0; i < k; ++i)

   {

     a[first+i] = temp[i];

   }

}

 

void mergeSort(int a[], int first, int last, int temp[])

{

   if(first < last)

   {

     int mid = (last + first)/2; //注意用加號(hào),不是減號(hào), 

     //將數(shù)組劃分成由單個(gè)數(shù)組成的數(shù)列,則就可看成是每個(gè)數(shù)列都是有序的,可以用mergeArray函數(shù)了

     mergeSort(a, first, mid, temp);

     mergeSort(a, mid+1, last, temp);

     mergeArray(a, first, mid, last, temp);

   }

}

 

bool MergeSort(int a[], int n)

{

   int *p = new int[n];

   if(p == NULL)

   {

     return false;

   }

   else

   {

     mergeSort(a, 0, n-1, p);

     delete[] p;

     return true;

   }

}
QQ截圖20160315092144.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容