這個是嚴格按照虛擬碼寫的,半成品:#include <iostream><br />// 數組為a[0],a[1].....a[p],a[p+1],a[p+2]....a[q]..a[r],a[r+1]......;<br />// 一共進來七次<br />// first a[0],a[1] then a[2],a[3],<br />// then a[0]~a[3]<br />// then a[4],a[5], then a[6],a[7]<br />// then a[4]~a[7]<br />// then a[0]~a[7].<br />void merge(int* a, int p, int q, int r)<br />{ // 第一次到這個函數時,p==0,q==0,r==1,把這個由二個元素組成的數組看作是由兩個已經排序的大小為1的數組組成<br /> // a[0]==5,a[1]==2<br />for (int ii=p; ii<p+(r-p+1); ++ii)<br />{<br />std::cout <<a[ii]<<" ";<br />}<br />std::cout<<std::endl;<br />int n1=q-p+1; // 因為把下標為q的元素分到了第一個數組中,所以n1為q-p+1<br />int n2=r-q;<br />int* L=new int[n1+1]; // 多一個元素用來放哨兵<br />int* R=new int[n2+1];<br />for (int i=0; i<n1; ++i)<br />L[i]=a[p+i];<br />for (int j=0; j<n2; ++j)<br />R[j]=a[q+j+1];<br />// L[n1]=1024*1024*1024*2-1; // 2^31-1次方,在這裡編譯器有警告是不是說,這個整型字面值1024*1024*1024*2<br />// R[n2]=1024*1024*1024*2-1; // 編譯器是由一個字表示的,所以這裡就已經越界了,我不曉得了。那我這<br /> // 樣表示應該就可以了。<br />L[n1]=1024*1024*1024-1+1024*1024*1024; // 這樣果然不警告了。<br />R[n2]=1024*1024*1024-1+1024*1024*1024;<br />int i=0;<br />int j=0;<br />for (int k=p; k<=r; ++k)<br />{<br />if (L[i]<=R[j])<br />{<br />a[k]=L[i];<br />++i;<br />}<br />else<br />{<br />a[k]=R[j];<br />++j;<br />}<br />}<br />for (int ii=p; ii<p+(r-p+1); ++ii)<br />{<br />std::cout<<a[ii]<<" ";<br />}<br />std::cout<<std::endl;<br />}<br />void merge_sort(int* a, int p, int r)<br />{<br />if (p<r)<br />{<br />int q=(p+r)/2;<br />merge_sort(a, p, q); // 第一次,從這裡開始了對a[0],a[1],a[2],a[3]的devide<br /> // 第二次,從這裡開始了對a[0],a[1]的devide。<br /> // 第三次,從這裡開始了對a[0],a[0]devede,進入merge_sort後直接退出,<br /> // 然後第一次進入了merge_sort(a, q+1, r)這個語句。<br />merge_sort(a, q+1, r); // first time,從這裡開始了對a[1],a[1]的devide,進入merge_sort後直接退出,<br /> // 相當於對a[0],a[1]這個數組的devide過程已經結束,也可以說merge_sort相鄰的兩個元素時可以開始merge的過程了。</p><p> merge(a, p, q, r); // 這個過程是merge(a, 0, 0, 1);將這個由兩個元素的大數組當成兩個數組開始merge。<br /> // 之後應該是對a[2],a[3]的devide過程,進入merge_sort(a, q+1, r)實施。<br /> // 這個過程首先由merge_sort(a, p, q)devide,a[2],a[2]直接退出後,由<br /> // merge_sort(a, q+1, r)來完成devide,a[3],a[3]直接退出後,進入a[2],a[3]<br /> // 的過程。<br /> // 再然後就是merge,a[0],a[1],a[2],a[3]的過程。過個函數結束,也就是棧<br /> // 返回到第一次進入merge_sort(a, p, q)的地方。然後開始devide,<br /> // a[4],a[5],a[6],a[7]然後開始devide,a[4],a[5],devide,a[4],a[4],<br /> // devide,a[5],a[5].merge,a[4],a[5],devide,a[6],a[7],devide,a[6],a[6]<br /> // devide,a[7],a[7],merge,a[6],a[7],merge,a[4],a[5],a[6],a[7],<br /> // merge,a[0~7]結束。<br />}<br />}<br />int main()<br />{<br /> /*int a[10]={2, 5, 3, 8, 1, 4, 23, 2, 123, 4};<br /> for (int i=0; i<10; ++i)<br /> {<br /> std::cout<<a[i]<<" ";<br /> }<br />merge_sort(a, 0, 9);<br /> for (int i=0; i<10; ++i)<br /> {<br /> std::cout<<a[i]<<" ";<br /> }*/<br />int a[8]={5, 2, 4, 7, 1, 3, 2, 6};<br />merge_sort(a, 0, 7);<br /> for (int i=0; i<8; ++i)<br /> {<br /> std::cout<<a[i]<<std::endl;<br /> }<br />return 0;<br />}
這是把哨兵去掉,用數組邊界檢查寫的:#include <iostream><br />void merge(int* a, int p, int q, int r)<br />{<br /> int n1=q-p+1;<br /> int n2=r-q;<br /> int* L=new int[n1+1];<br /> int* R=new int[n2+1];<br /> for (int i=0; i<n1; ++i)<br /> L[i]=a[p+i];<br /> for (int j=0; j<n2; ++j)<br /> R[j]=a[q+j+1];<br /> int i=0;<br /> int j=0;<br /> for (int k=p; k<=r; k++)<br /> {<br /> if (i==n1)<br /> {<br /> while (j<n2)<br /> {<br /> a[k++]=R[j++];<br /> }<br /> return;<br /> }<br /> if (j==n2)<br /> {<br /> while (i<n1)<br /> {<br /> a[k++]=L[i++];<br /> }<br /> return;<br /> }<br /> if (L[i]<=R[j])<br /> {<br /> a[k]=L[i++];<br /> }<br /> else<br /> {<br /> a[k]=R[j++];<br /> }<br /> }<br />}<br />void merge_sort(int* a, int p, int r)<br />{<br /> if (p<r)<br /> {<br /> int q=(p+r)/2;<br /> merge_sort(a, p, q);<br /> merge_sort(a, q+1, r);<br /> merge(a, p, q, r);<br /> }<br />}<br />int main()<br />{<br /> int a[8]={5, 2, 4, 7, 1, 3, 2, 6};<br /> merge_sort(a, 0, 7);<br /> for (int i=0; i<8; ++i)<br /> {<br /> std::cout << a[i] << std::endl;<br /> }<br /> return 0;<br />}<br />
封裝在了類裡面,重載了操作符,其實東西都是一樣的:#include <iostream><br />using namespace std;<br />class CIntMergeSort {<br />public:<br /> CIntMergeSort(const int& iLength)<br /> {<br /> length = iLength;<br /> pI = new int[iLength];<br /> if (NULL == pI)<br /> {<br /> // error bad alloc<br /> }<br /> memset(pI, 0, iLength * 4);<br /> }<br /> ~CIntMergeSort()<br /> {<br /> delete[] pI;<br /> }<br /> friend istream& operator>>(istream& is, CIntMergeSort& object)<br /> {<br /> int i = 0;<br /> int j = 0;<br /> int* q = object.pI;<br /> //while (i++ != object.length)<br /> //{<br /> // is >> j;<br /> // *q++ = j;<br /> //}<br /> while ((i++ != object.length) && (is >> j))<br /> {<br /> *q++ = j;<br /> }<br /> if (i != object.length + 1)<br /> {<br /> cout << "error bad int istream, reinput" << endl;<br /> memset(object.pI, 0, object.length * 4);<br /> is.clear();<br /> is.sync();<br /> is >> object;<br /> return is;<br /> }<br /> object.merge_sort(0, object.length - 1);<br /> return is;<br /> }<br /> friend ostream& operator<<(ostream& os, const CIntMergeSort& object)<br /> {<br /> const int* q = object.pI;<br /> for (int i = 0; i != object.length; i++)<br /> {<br /> os << *q++ << " ";<br /> os << endl;<br /> }<br /> return os;<br /> }<br />private:<br /> void merge(int p, int q, int r)<br /> {<br /> int n1 = q - p + 1;<br /> int n2 = r - q;<br /> int* L = new int[n1 + 1];<br /> int* R = new int[n2 + 1];<br /> for (int i = 0; i < n1; ++i)<br /> L[i] = pI[p + i];<br /> for (int j = 0; j < n2; ++j)<br /> R[j] = pI[q + j + 1];<br /> int i = 0;<br /> int j = 0;<br /> for (int k = p; k <= r; k++)<br /> {<br /> if (i == n1)<br /> {<br /> while (j < n2)<br /> {<br /> pI[k++] = R[j++];<br /> }<br /> return;<br /> }<br /> if (j == n2)<br /> {<br /> while (i < n1)<br /> {<br /> pI[k++] = L[i++];<br /> }<br /> return;<br /> }<br /> if (L[i] <= R[j])<br /> {<br /> pI[k] = L[i++];<br /> }<br /> else<br /> {<br /> pI[k] = R[j++];<br /> }<br /> }<br /> delete[] L;<br /> delete[] R;<br /> }<br /> void merge_sort(int p, int r)<br /> {<br /> if (p<r)<br /> {<br /> int q=(p + r) / 2;<br /> merge_sort(p, q);<br /> merge_sort(q + 1, r);<br /> merge(p, q, r);<br /> }<br /> }<br />private:<br /> int* pI;<br /> int length;<br />};<br />int main()<br />{<br /> CIntMergeSort a(5); // how many numbers to be sorted?<br /> cin >> a; // input the numbers<br /> cout << a; // output the sorted numbers<br /> return 0;<br />}<br />