算法四:归并排序

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;

首先来练习一下将两个有序的数组,合并成一个有序的数组

void mergeArray(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++] = b[j++];
        }
        else
        {
            c[k++] = a[i++];
        }
    }
    while (i < n)
        c[k++] = a[i++];
    while (j < n)
        c[k++] = b[j++];
}

数组:3,1,2,6,9

将数组从中间位置看成两个无序的数组,然后再将左右两个无序的数组,

再将左右两个无序的数组再从中间分开,有变成两个无序的数组。。。。

就变成了递归的调用。最后再一次合并数组

#include<iostream>

using namespace std;

void merge(int sore[],int temp[],int start, int mid,int end)
{
    int i = start;
    int j = mid+1;
    int k = 0;
    while(i<=mid&&j<=end)
    {
       if(sore[i] >sore[j])
             temp[k++] = sore[j++];
       else
             temp[k++] = sore[i++];
    }
   while(i <= mid)
        temp[k++] = sore[i++];
   while(j <= end)
        temp[k++] = sore[j++];
   for(i = 0;i<K;i++)
      sore[start + i] = temp[i];
}

void mergeSort(int sore[],int temp[],int start,int end)
{
    if(start < end)
    {
        int min = (start + end)/2;
        mergeSort(sore,temp, start,mid);
        mergeSort(sore,temp,mid+1,end);
        merge(sore,temp,start,mid,end); 
    }
}

int main()
{
     int a[5] = {3,1,2,6,9};
     int b[5];
     mergeSort(a,b,0,4);
     for(int i = 0;i < 5;i++)
     {
         printf("%d   ", a[i]);
     }             
} 

 归并排序的形式就是一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的可以得出它的时间复杂度是O(n*log2n)。

因为要创建一个临时的数据所以空间复杂度为O(N),复杂度比较复杂,是一种稳定的排序。

原文地址:https://www.cnblogs.com/xiaoma123/p/5220353.html