淺談歸併排序
阿新 • • 發佈:2020-07-17
歸併排序應該說是算得上一個非常優秀的演算法。因為,到後面學習資料結構的時候你可以發現,很多的資料結構題無不用到了歸併排序的思想,有一點像堆排序,同快速排序不一樣,他們都不是線性排序。
下面放一張圖,大家可以大概感受一下歸併排序的過程是怎麼樣的。
其實我們只需要分到最小的,然後在遞歸回來就可以實現該操作了,具體程式碼如下:
void mergesort(int a[], int first, int last, int temp[]) { if (first < last) { int mid = (first + last) / 2; mergesort(a, first, mid, temp); //左邊有序 mergesort(a, mid + 1, last, temp); //右邊有序 mergearray(a, first, mid, last, temp); //再將二個有序數列合併 } }
合併的操作也是非常的簡單的,只是需要一點小小的腦補,就是我們把兩個要合併的內容進行逐個對比,小的先合併進去,大的後合併,然後依次填滿就可以了。這是在回溯的過程中執行的(mergearrey)下面放一篇截過的程式碼:
void mergearray(int a[], int first, int mid, int last, int temp[]) { int i = first, j = mid + 1; int m = mid, n = last; int k = 0; while (i <= m && j <= n) { if (a[i] <= a[j]) temp[k++] = a[i++]; else temp[k++] = a[j++]; } while (i <= m) temp[k++] = a[i++]; while (j <= n) temp[k++] = a[j++]; for (i = 0; i < k; i++) a[first + i] = temp[i]; }
然後大家應該就學會了吧!!!我也告辭了!
謝謝採納!!!