归并排序算法

来源:互联网 发布:大数据商业计划书 编辑:程序博客网 时间:2024/06/18 01:42

归并排序是将数列a[l,h]分成两半a[l,mid]和a[mid+1,h]分别进行归并排序,然后再将这两半合并起来。

在合并两个数列,只要从比较两个数列的第一个数,谁小就先取谁,取了之后就在对应数列中删除这个数。然后再比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。

//将有序数组a[]和b[]合并到c[]中  void MemeryArray(int a[], int n, int b[], int m, int c[])  {      int i, j, k;        i = j = k = 0;      while (i < n && j < m)      {          if (a[i] < b[j])              c[k++] = a[i++];          else              c[k++] = b[j++];       }        while (i < n)          c[k++] = a[i++];        while (j < m)          c[k++] = b[j++];  }
如何让这两个数组组内数据有序?

可以将A,B各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以。

这样通过先递归的分解数列,再合并数列就完成了归并排序。

//将有二个有序数列a[first...mid]和a[mid...last]合并。  void mergearray(int a[], int first, int mid, int last, int temp[])  {      int i = first, j = mid + 1;      int m = mid,   n = last;      int k = 0;            while (i <= m && j <= n)      {          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;  }  

归并排序的效率比较高,设数列的长度为N,将数列分成小数列一共要logN步,每步都是一个合并有序数列的过程,时间复杂度可以记为O(N),共为O(logN*O(N)).。

原创粉丝点击