输入:N个数,<a1,a2,a3.....an>输出:输入的一个非降序或非升序排列<b1,b2....bn>
算法:利用了分治法结合递归的思想来解决。分治模式在每一层递归上都满足三个步骤。
S1:分解(Devide)将原问题分解成若干个子问题;
S2:解决(Conquer)递归地解决各个子问题。如果子问题足够小了,小到可以直接解决,就直接解决。
S3:合并(Combine)将各个子问题的结果合并就是原问题的解了。
合并排序算法完全依照上述三个步骤:
S1:将n个元素划分成各含有n/2个元素的子序列;
S2:用合并排序法将这n/2个元素就地排序;
S3:合并已经排好序的两个子数组。
对于分解何时结束,那么就要看可以解决的最小问题的规模了。我们默认子问题含有一个元素的时候,已经排好序。
合并排序中的关键步骤就在于如何合并两个已经排好序的数组。假设要排序的数组的下标从p变化到q变化到r,那么就是要合并A[p....q]和B[q+1....r]
代码:
/*合并排序*/
#include<iostream>
using namespace std;
//合并两个有序数组,使得排序后的数组仍然有序
void merge(int *A,int p,int q,int r)
{
int n1 = q-p+1;
int n2 = r-q;
int i ;
int j;
int *L = new int[n1];
int *R = new int[n2];
for(i = 0; i < n1;i++)
{
L[i] = A[p+i];
}
for(j = 0;j < n2;j++)
{
R[j]=A[q+j+1];
}
i = 0;
j = 0;
int k = p;
while(i<n1 && j<n2)
{
if(L[i] < R[j])
{
A[k]= L[i];
i++;
k++;
}
else
{
A[k] = R[j];
j++;
k++;
}
}
while (i < n1)
{
A[k] = L[i];
i++;
k++;
}
while(j< n2)
{
A[k] = R[j];
j++;
k++;
}
delete [] L;
delete [] R;
}
//分解并且递归
void mergeSort(int *A ,int p ,int r)
{
int q ;
if(p<r)
{
q = (p+r)/2;
mergeSort(A,p,q);
mergeSort(A,q+1,r);
merge(A,p,q,r);
}
}
void main()
{
int n;
cout << "how many numbers do you want to sort " << endl;
cin >> n;
int *A = new int [n];
for(int i = 0;i < n;i++)
{
cin >> A[i];
}
mergeSort(A,0,n-1);
// int A[10]={1,32,11,23,2,51,5,32,4,3};
//mergeSort(A,0,9);
for(int i = 0;i<10;i++)
{
cout<<A[i]<<endl;
}
}