#include
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;
}
感悟:
思想的重要性,如果你的思想沒有在你編程時產生火焰,即使你對別人
思想理解的再深刻,終究只是別人的東西,時間一長,你就會發現你已經
被這些看似光芒四射的東西所奴役,就會越來越累。哈哈,拙見,一起努力。