归并排序

来源:互联网 发布:薛家 知乎 编辑:程序博客网 时间:2024/05/22 11:28

合并法

两个有序数组a[],b[],总是比较第一个值,取小的保存在数组c[]

归并法

当数组有n个元素,可以把每两个元素当成两个有序数组排序,再将这个数组与其他元素组成的数组排序

实现:可以从数组的中间不断分割数组,用递归很方便实现

//将有二个有序数列a[first...mid]和a[mid...last]合并。  void mergearray(int a[], int first, int mid, int last, int temp[])  #合并数组,参数为数组a[],起始值,中间值,结束值,将小的放在前面{      int i = first, j = mid + 1;      int m = mid,   n = last;      int k = 0;            while (i <= m && j <= n)  #如果哪个值小,将其存入temp,    {          if (a[i] <= a[j])              temp[k++] = a[i++];          else              temp[k++] = a[j++];      }            while (i <= m)          temp[k++] = a[i++];            while (j <= n)          temp[k++] = a[j++];            for (i = 0; i < k; i++)          a[first + i] = temp[i];  }  void mergesort(int a[], int first, int last, int temp[])  #采用递归的方法,从中间件拆开数组,排好序将其合并{      if (first < last)      {          int mid = (first + last) / 2;          mergesort(a, first, mid, temp);    //左边有序          mergesort(a, mid + 1, last, temp); //右边有序          mergearray(a, first, mid, last, temp); //再将二个有序数列合并      }  }    bool MergeSort(int a[], int n)  {      int *p = new int[n];      if (p == NULL)          return false;      mergesort(a, 0, n - 1, p);      delete[] p;      return true;  



0 0
原创粉丝点击