思路: 归并排序使用了分治思想进行实现。对一个数组进行二分法,使用递归实现二分法。
首先有一个数组C,可以将C数组分为A,B两组,然后各自再把A,B分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了。
这样通过先递归的分解数列,再合并数列就完成了归并排序。
#include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; template <typename T> void merge( T arr[], int iLeft, int iMid, int iRight ) { T temp[ iRight - iLeft + 1 ]; int k = 0; int i = iLeft, j = iMid + 1; while( i <= iMid && j <= iRight ) { if( arr[ i ] <= arr[ j ] ) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while( i <= iMid ) //对于左侧有序数组中多余的元素进行插入 { temp[k++] = arr[i++]; } while( j <= iRight ) //对于右侧有序数组中多余的元素进行插入 { temp[k++] = arr[j++]; } for( int l = 0; l < k; l++ ) { arr[iLeft+l] = temp[l]; } } template<typename T> void mergeSort( T arr[], int iLeft, int iRight ) { if( iLeft >= iRight ) { return; } int mid = (iLeft + iRight)/2; mergeSort( arr, iLeft, mid ); mergeSort( arr, mid+1, iRight ); merge( arr, iLeft, mid, iRight ); } int main( ) { //setbuf(stdout,NULL); unsigned int pucBuff[10] = {3,4,1,7,3,7,8,9,4,0}; cout << "排序前 " << endl; for( unsigned int i = 0; i < sizeof(pucBuff)/sizeof(int); i++ ) { cout << pucBuff[i] << " " ; } cout << endl; mergeSort( pucBuff, 0, sizeof(pucBuff)/4 -1 ); cout << "排序后 " << endl; for( unsigned int i = 0; i < sizeof(pucBuff)/4; i++ ) { cout<< pucBuff[i]<< " "; } cout<<endl; return 1; }