標籤:思想的重要性 歸併演算法
#include <iostream>using namespace std;void DealWhat(int ar[],int start,int end,int b[]){ int mid = (start + end) / 2; int i = start; int j = mid+1; int k = start; //將start到end區間劃分為兩個部分,對這兩個部分進行合并排序,每個部分應該是有序的,因為我們是從一個數字開始排序, //直到多個數位排序,所以部分一定是有序的,逆向逐漸有序。 while (i <= mid && j <= end) { if (ar[i] > ar[j]) { b[k++] = ar[j]; j++; } else { b[k++] = ar[i]; i++; } } while (i <= mid) { for (; i <= mid; i++) { b[k++] = ar[i]; } } while (j <= end) { for (; j <= end; j++) { b[k++] = ar[j]; } }//以上是合并排序。 k = 0; for (int m = start; m <= end; m++) { ar[m] = b[m];//ar數組的值也應該相應的變化,因為在start到end之間已經排序好了,我們只需要將排序好的覆蓋ar數組上面去, //為下次遞迴排序做準備工作。 }}void Grial(int ar[],int start,int end,int b[]){ if (start >= end)return; int mid = (start + end) / 2;//每次取1/2遞迴深入。 Grial(ar, start, mid ,b);//左邊。 Grial(ar,mid+1, end,b);//右邊。 DealWhat(ar,start, end,b);//處理函數,直到遞迴到單個數字。}int main(){ int a[] = {100,2,3,1,99,32,4,11,324,0}; int *b = new int[10]; Grial(a,0,9,b); for (int i = 0; i < 10; i++) { cout << b[i]<<" " ; } cout << endl;//其實這一步數組b到這個地方就可以delete了,因為數組a也隨著排序改變,藉助b這個輔助空間 //間接的排序原來的數組,本來可以不需要在外面傳遞b,不過我也不想修改了。 for (int i = 0; i < 10; i++) { cout << a[i]<<" "; } cout << endl; return 0;}
感悟:
思想的重要性,如果你的思想沒有在你編程時產生火焰,即使你對別人
思想理解的再深刻,終究只是別人的東西,時間一長,你就會發現你已經
被這些看似光芒四射的東西所奴役,就會越來越累。哈哈,拙見,一起努力。
C++歸併演算法