嗯...
归并排序这个东西,主要用了分治的思想,并且有一点递归的意思...
详细看代码...
1 #include<cstdio> 2 using namespace std; 3 int n,z[233],y[233]; 4 5 void merge_sort(int l,int r)//归并排序,用到了分治的思想,两个参数分别为左端点和右端点 6 { 7 if (l==r) return;//l==r则它是空的 8 int m=(l+r)/2;//进行分治,m为它的中点 9 merge_sort(l,m);//将从第一个到m再进行归并排序 10 merge_sort(m+1,r);//将从m+1个到r再进行归并排序 11 //注意直到分治成每一块只有一个数据为止,一个类似递归的思想 12 int p1=l,p2=m+1;//将第一大块的第一个数定义为p1,第二大块的第一个数定义为p2,相当于指针 13 for (int a=l;a<=r;a++)//将所有数据进行循环搜索 14 { 15 if (p1 > m) //如果p1超出了第一块的范围 16 { 17 y[a] = z[p2];//那么就将p2位置的数放入y数组 18 p2 ++;//p2指针后移 19 } 20 else if (p2 > r)//如果p2超出了第二块的范围 21 { 22 y[a] = z[p1];//那么就将p1位置的数放入y数组 23 p1++;//p1指针后移 24 } 25 else if (z[p1] < z[p2])//如果除了上述情况且p1位置的数比p2位置的数小 26 { 27 y[a] = z[p1];//则将p1位置的数放入y数组 28 p1++;//p1指针后移 29 } 30 else//最后一种情况只需要用else即可 31 { 32 y[a] = z[p2];//p2位置的数放入y数组 33 p2 ++;//p2指针后移 34 } 35 } 36 for (int a=l;a<=r;a++) 37 z[a]=y[a];//将z数组更新,将排好序的序列放入z数组 38 } 39 40 int main() 41 { 42 //主函数进行读入、调用、输出 43 scanf("%d",&n); 44 for (int a=1;a<=n;a++) 45 scanf("%d",&z[a]); 46 merge_sort(1,n); 47 for (int a=1;a<=n;a++) 48 printf("%d ",z[a]); 49 }
相信能看懂....