算法思想(一般分治都是这三种思想):
1.分解:将待排序的问题分解成大小大致相等的两部分。
2.求解子问题:用归并排序的方法对两个子问题进行递归排序。
3.合并(merge):将排好序的有序子序列进行合并,得到符合要求的子序列。
code:
#include <iostream>
using namespace::std;
void merge(int array[],int low,int middle,int high){//融合的过程
int i = low,j = middle + 1,k = 0;
int t[high - low + 1];
while (i <= middle && j <= high)
if (array[i] <= array[j])
t[k++] = array[i++];
else
t[k++] = array[j++];
while (i <= middle)
t[k++] = array[i++];
while (j <= high)
t[k++] = array[j++];
for (i = low,j = 0; i <= high; i++,j++)
array[i] = t[j];
}
void mergeSort(int array[],int low,int high){
int middle;
if (low == high) return; //切记这里千万不要写成while,逗比的我弄了几个小时。。。
middle = (low + high)/2;
mergeSort(array,low,middle);
mergeSort(array,middle+1,high);
merge(array,low,middle,high);
}
int main(int argc, const char * argv[]) {
int n,i = 0;
cout<<"input the count of the number:";
cin>>n;
int k = n,array[n];
cout<<"input "<<n<<" numbers:";
while (n--) {
cin>>array[i++];
}
mergeSort(array, 0, k - 1);
cout<<"after mergeSore:"<<endl;
for (i = 0; i < k; i++) {
cout<<array[i]<<" ";
}
cout<<endl;
return 0;
}
时间复杂度的分析:
假设待排序的元素个数位n。
显然,当n = 1时,O(n) = 1.
当n > 1时,将时间T分解:
middle = (low + high)/2; //O(1)
mergeSort(array,low,middle); //O(n/2)
mergeSort(array,middle+1,high);//O(n/2)
merge(array,low,middle,high);//O(n)
得出时间复杂度公式:
T(n) = O(1) n = 1
T(n) = 2O(n/2) + O(n) n > 1
的递归式。
根据master定理的其时间复杂度O(n) = nlog(n).
ps:不知道master定理的找度娘吧,这个是专门推断递归的时间复杂度的。