数据结构 递归排序

这是第一次看完算法导论递归排序后自己用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);
}
发布了90 篇原创文章 · 获赞 7 · 访问量 2185

猜你喜欢

转载自blog.csdn.net/weixin_43784305/article/details/101066877