今天尝试着把 归并排序算法做了一遍,呵呵,得出一个感觉,不要照着书敲代码,因为那样东西永远不会成为你的。
而且,因为是书上代码,你就不会仔细阅读,很容易犯些低级错误。
言归正传,归并排序主要还是用的分治法,把范围不断划小然后排序。然后再把前后两个数组进行比较排序,排到一个生成的临时数组里,最后将临时数组里的元素按下标拷贝回来。
贴代码吧,c#版,发现自己不会写c++了,晕倒哦
void Mergsort(ref int[] A, int high, int low)
{
int mid = 0;
if (high - low > 1)
{
mid = (high + low) / 2;
Mergsort(ref A, mid, low);
Mergsort(ref A, high, mid);
Merge(ref A, low,high);
}
else
{
if (A[low] > A[high])
{
int temp = A[high];
A[high] = A[low];
A[low] = temp;
}
}
}
void Merge(ref int[] A, int low, int high)
{
int[] temp = new int[A.Length];
int mid = (low + high) / 2;
int i = low; //第一组计数
int j = low; //复制组标注
int h = mid; //第二组计数
int k = 0;
while (i <mid && h <= high)
{
if (A[i] > A[h])
{
temp[j] = A[h];
h++;
}
else
{
temp[j] = A[i];
i++;
}
j++;
}
if (i >= mid)
{
for (k = h; k <= high; k++)
{
temp[j] = A[k];
j = j + 1;
}
}
for(int m=low;m<high;m++)
{
A[m] = temp[m];
}
}
最大的问题就是临时数组应该根据传进来的范围来申请就好了,那样会更节约一些空间
而且,因为是书上代码,你就不会仔细阅读,很容易犯些低级错误。
言归正传,归并排序主要还是用的分治法,把范围不断划小然后排序。然后再把前后两个数组进行比较排序,排到一个生成的临时数组里,最后将临时数组里的元素按下标拷贝回来。
贴代码吧,c#版,发现自己不会写c++了,晕倒哦
void Mergsort(ref int[] A, int high, int low)
{
int mid = 0;
if (high - low > 1)
{
mid = (high + low) / 2;
Mergsort(ref A, mid, low);
Mergsort(ref A, high, mid);
Merge(ref A, low,high);
}
else
{
if (A[low] > A[high])
{
int temp = A[high];
A[high] = A[low];
A[low] = temp;
}
}
}
void Merge(ref int[] A, int low, int high)
{
int[] temp = new int[A.Length];
int mid = (low + high) / 2;
int i = low; //第一组计数
int j = low; //复制组标注
int h = mid; //第二组计数
int k = 0;
while (i <mid && h <= high)
{
if (A[i] > A[h])
{
temp[j] = A[h];
h++;
}
else
{
temp[j] = A[i];
i++;
}
j++;
}
if (i >= mid)
{
for (k = h; k <= high; k++)
{
temp[j] = A[k];
j = j + 1;
}
}
for(int m=low;m<high;m++)
{
A[m] = temp[m];
}
}
最大的问题就是临时数组应该根据传进来的范围来申请就好了,那样会更节约一些空间