归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(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),复杂度比较复杂,是一种稳定的排序。