归并排序
基本思想:将待排序元素分成大小大致相同的2个子集合,
分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。
#include <iostream> using namespace std; int a[100],b[100]; /*参数的传递是将实参的值赋给形参。 *然而对于数组来说却是一个例外, *因为数组的数据太多了,将其一一赋值既麻烦又浪费空间, *所以数组作为参数传递给函数的只是数组首元素的地址, *函数在需要用到后面元素时再按照这个地址和数组下标去查找。 */ void Merge(int c[],int d[],int l,int m, int r) { //合并c[1:m]和c[m+1:r]到d[l,r] int i = l, j = m+1, k = l; while(i <= m && j <= r) //两表中元素比较,类似于打擂台,大的复制到临时数组中 { if(c[i] < c[j]) { d[k++] = c[i++]; } else { d[k++] = c[j++]; } } //若前一个子序列剩余,则直接复制入临时数组 if(i > m) { for(int q = j; q <= r; q++) d[k++] = c[q]; } //后一个子序列 else { for(int q = i; q <= m; q++) d[k++] = c[q]; } } void Copy(int a[],int b[],int left,int right) { for(int i = left; i <= right; i++) a[i] = b[i]; } void MergeSort(int a[],int left,int right) { if(left < right) //至少有两个元素,也是递归的结束条件 { int i = (left + right)/2; MergeSort(a,left,i); MergeSort(a,i+1,right); Merge(a,b,left,i,right); //合并到临时数组b Copy(a,b,left,right); //复制回数组a } } int main() { int n; cin >> n; for(int i = 0; i < n; i++) { cin >> a[i]; } MergeSort(a,0,n-1); for(int i = 0; i < n; i++) { cout << a[i] << " "; } return 0; }