这是第一次看完算法导论递归排序后自己用C语言写的,基本上是照着书上的思路写一遍
void merge(int arr[], int p, int q, int r)
{
int *a1 = (int*)malloc(sizeof(int)*(q - p + 2)), *a2 = (int*)malloc(sizeof(int)*(r - q+1));
for (int i = 0; i < q - p + 1; i++)
a1[i] = arr[p + i];
for (int i = 0; i < r - q; i++)
a2[i] = arr[q + 1 + i];
a1[q- p + 1] = 100;
a2[r - q] = 100;
int count = p,i=0,j=0;
while (count<=r)
{
if (a1[i] <= a2[j])
arr[count++] = a1[i++];
else
arr[count++] = a2[j++];
}
}
void mergesort(int arr[], int p, int q)
{
if (p == q)
return;
mergesort(arr, p, (p + q) / 2);
mergesort(arr, (p + q) / 2 + 1, q);
merge(arr, p, (p + q) / 2, q);
}
这是第二遍看完后,按照自己的思路写的,代码看起来更简洁一点
void merge(int arr[], int p, int q)
{
int mid = (p + q) / 2;
vector<int> a1, a2;
for (int i = p; i <= mid; i++)
a1.push_back(arr[i]);
for (int i = mid + 1; i <= q; i++)
a2.push_back(arr[i]);
a1.push_back(INT_MAX);
a2.push_back(INT_MAX);
int n = p;
auto p1 = a1.begin(), p2 = a2.begin();
while (n<=q)
{
if (*p1 <= *p2)
arr[n++] = *p1++;
else
arr[n++] = *p2++;
}
}
void mergesort(int arr[], int p, int q)
{
if (p >= q) return;
int mid = (p + q) / 2;
mergesort(arr, p, mid);
mergesort(arr, mid + 1, q);
merge(arr, p, q);
}