Tuesday 7 April 2015

Merge Sort

Dalam ilmu komputer , menggabungkan semacam ( juga biasa dieja mergesort ) adalah O ( n log n ) perbandingan berbasis algoritma sorting . Kebanyakan implementasi menghasilkan semacam stabil , yang berarti bahwa pelaksanaan mempertahankan urutan masukan dari elemen yang sama dalam output diurutkan . Mergesort adalah membagi dan menaklukkan algoritma yang diciptakan oleh John von Neumann pada tahun 1945.

Sebuah penjelasan rinci dan analisis bottom - up mergesort muncul dalam sebuah laporan oleh Goldstine dan Neumann pada awal 1948.

Algorithm

 

Menggabungkan semacam animasi . Unsur-unsur diurutkan diwakili oleh titik .Secara konseptual , merge semacam bekerja sebagai berikut : 
  1. Bagilah daftar disortir ke n sublists , masing-masing berisi 1 elemen ( daftar 1 elemen dianggap diurutkan ). 
  2.  berulang menggabungkan sublists untuk menghasilkan sublists diurutkan baru sampai hanya ada 1 sublist tersisa . Ini akan menjadi daftar diurutkan .Implementasi top -downContoh C seperti kode menggunakan indeks untuk top down algoritma merge sort secara rekursif membagi daftar ( disebut berjalan dalam contoh ini ) ke dalam sublists sampai ukuran sublist adalah 1 , kemudian menggabungkan mereka sublists untuk menghasilkan daftar diurutkan .
Salinan kembali langkah dapat dihindari jika rekursi berganti-ganti antara dua fungsi sehingga arah penggabungan sesuai dengan tingkat rekursi TopDownMergeSort(A[], B[], n) {    TopDownSplitMerge(A, 0, n, B);}// iBegin is inclusive; iEnd is exclusive (A[iEnd] is not in the set)TopDownSplitMerge(A[], iBegin, iEnd, B[])
{    
if(iEnd - iBegin < 2)                       // if run size == 1         return;                                 //   consider it sorted     // recursively split runs into two halves until run size == 1,     // then merge them and return back up the call chain    iMiddle = (iEnd + iBegin) / 2;              // iMiddle = mid point    TopDownSplitMerge(A, iBegin,  iMiddle, B);  // split / merge left  half    TopDownSplitMerge(A, iMiddle,    iEnd, B);  // split / merge right half    TopDownMerge(A, iBegin, iMiddle, iEnd, B);  // merge the two half runs    CopyArray(B, iBegin, iEnd, A);              // copy the merged runs back to A}//  left half is A[iBegin :iMiddle-1]// right half is A[iMiddle:iEnd-1   ]TopDownMerge(A[], iBegin, iMiddle, iEnd, B[]){    i0 = iBegin, i1 = iMiddle;    // While there are elements in the left or right runs    for (j = iBegin; j < iEnd; j++) {        // If left run head exists and is <= existing right run head.        if (i0 < iMiddle && (i1 >= iEnd || A[i0] <= A[i1]))            B[j] = A[i0];            i0 = i0 + 1;        else            B[j] = A[i1];            i1 = i1 + 1;        }}CopyArray(B[], iBegin, iEnd, A[]){    for(k = iBegin; k < iEnd; k++)
        A[k] = B[k];}

 

Itulah sedikit informasi semoga bermanfaat
source = http://en.wikipedia.org/wiki/Merge_sort