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