归并排序

来源:互联网 发布:淘宝企业店铺升级流程 编辑:程序博客网 时间:2024/06/05 19:17
#include <iostream>#include <time.h>using namespace std;void Merge( int* _arr, int p, int q, int r ); void MergeSort( int* _arr, int p, int r );void Print( int* _arr, int _num );int main(){srand(time(NULL));int m = 0, Index = 0;scanf("%d",&m);int* arr = (int*)malloc( m * sizeof(int) );while( Index < m ){arr[Index] = rand();++Index;}printf("归并排序前\n");Print(arr,m);MergeSort( arr, 0, Index-1);printf("归并排序后\n");Print(arr,m);free(arr);system("pause");}void MergeSort( int* _arr, int p, int r ){int q;if( p < r ){q = (int)((p+r) / 2);MergeSort( _arr, p, q );//_arr[p,q]排序MergeSort( _arr, q+1, r);//_arr[q+1,r]排序Merge( _arr, p, q, r);//将_arr[p,q]和_arr[q+1,r]合并并排序}}//将已排序的两部分合并为已排序的新数组 其中p-q和q-r为已排序的void Merge( int* _arr, int p, int q, int r ){int n1 = q - p + 1;int n2 = r - q;//将arr[p,q]赋值给arr1,arr[q+1,r]赋值给arr2int* arr1 = (int*)malloc( (n1) * sizeof(int) );int* arr2 = (int*)malloc( (n2) * sizeof(int) );for( int i = 0; i < n1; ++i ){arr1[i] = _arr[p+i];}for( int k = 0; k < n2; ++k ){arr2[k] = _arr[q+k+1];}//循环比较arr1和arr2中的元素,将较小值放入arr中直到arr1或者arr2中的元素已经比较完毕int Index = p,Index1 = 0, Index2 = 0;while( Index1 < n1 && Index2 < n2 ){if( arr1[Index1] < arr2[Index2] ){_arr[Index] = arr1[Index1];Index++;Index1++;}else{_arr[Index] = arr2[Index2];Index++;Index2++;}}//将arr1或者arr2中剩余的元素放入arr中while( Index1 < n1 ){_arr[Index] = arr1[Index1];Index++;Index1++;}while( Index2 < n2 ){_arr[Index] = arr2[Index2];Index++;Index2++;}free(arr1);free(arr2);}void Print( int* _arr, int _num ){for( int i = 0; i < _num; ++i ){printf("%d ",_arr[i]);}printf("\n");}
0 0