归并排序:
(分治算法)
代码:
#include <iostream>
#include <limits.h>
#include <string.h>
#define MAMN 1000
using namespace std;
int A[MAMN];
void Merge(int *A, int p, int q, int r)
{
int i,j;
int n1 = q-p+1;
int n2 = r-q;
int L[MAMN],R[MAMN];
memset(L,0, (n1+1)*sizeof(int));
memset(R, 0, (n2+1)*sizeof(int));
for(i=0 ; i<n1 ; i++)
L[i] = A[p+i];
for(i=0 ; i<n2 ; i++)
R[i] = A[q+i+1];//分成两块,分别放到两个数组中
L[n1] = INT_MAX;//无穷大
R[n2] = INT_MAX;
i=0;
j=0;
//将其一个个放入,进行排序
for(int k = p ; k<=r ; k++){
if(L[i]<=R[j]){
A[k] = L[i];
i++;
}else{
A[k] = R[j];
j++;
}
}
}
//递归的思想
void Merge_sort(int *A , int p , int r){
if(p<r){
int q = (p+r)/2;
Merge_sort(A , p , q); //这里是将其分开的过程
Merge_sort(A , q+1 , r);
Merge(A , p , q , r); //这里是合并
}
}
int main()
{
int temp,num;
while(cin >> num){
for(i=0 ; i<num ; i++){
cin >> A[i];
}
Merge_sort(A,0,num-1);
for(i=0 ; i<num ; i++){
cout << A[i] << "";
}
cout << endl;
}
return 0;
}
T(n)= O(1) 若n=1;
2*T(n/2)+O(n) 若n>1
T(n)= c 若n=1;
2*T(n/2)+c*n 若n>1;
递归的总代价为c*n*log2n,也就是O(n*log2n)!!
递归在大数据的情况下,为比较优质的排序算法