#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;
}
感悟:
思想的重要性,如果你的思想没有在你编程时产生火焰,即使你对别人
思想理解的再深刻,终究只是别人的东西,时间一长,你就会发现你已经
被这些看似光芒四射的东西所奴役,就会越来越累。哈哈,拙见,一起努力。
时间: 2024-10-13 09:35:50