归并排序

来源:互联网 发布:微单哪款好 最好知乎 编辑:程序博客网 时间:2024/06/06 05:32

基本原理如上图,其中图C中的temp指向一个长度和红色竖线左边数组长度相等的辅助数组作为合并操作的辅助buffer,

#include <iostream>#include <cstdio>#include <cmath>#include <ctime>using namespace std ; int* array = NULL  ; void get_rand_num(int ** parray , int len)//生成一个随机数组{srand((unsigned int )time(NULL)) ; //下种子*parray = new int[len] ; for(int i = 0 ; i < len ; i++){(*parray)[i] = rand() % len ; }}void merge_sort(int * _array , int len ) {if(len <= 1) return;//递归基int *pleft = _array;int *pright = _array + len / 2 ; merge_sort(_array , len / 2 );//递归排序前半部分数组merge_sort(_array + len / 2  , len - len / 2 ) ;//递归排序后半部分数组//合并int *temp = new int[ len / 2] ;for(int i = 0 ;  i < len / 2 ; i++ ) {temp[ i ] = pleft[ i ] ;}int left = 0  , right = 0 ,  i = 0 ;  while(left < len /2 && right < len - len / 2){if(temp[ left] < pright[ right ] ){ pleft[ i ]= temp[ left ] ; left++ ; } else{pleft[ i ]= pright[ right ] ; right++ ; }i++ ; }if(left <len / 2 )for(int j = left ; j < len / 2 ; j++){ pleft[ i ] = temp[left] ; i++ ; } if(right < len - len / 2)for(int j = right ; j < len - len / 2 ; j++){ pleft[ i ] = pright[ j ] ; i++ ; }delete[ ]temp ; return ; }int main(int argc , char** argv){int len = 50 ; get_rand_num(&array , len) ; cout<<"before sort"<<endl ; for(int i = 0 ;  i < 50 ; i++){cout<<"array["<<i<<"]="<<array[i]<<endl ; }merge_sort(array , len) ; cout<<"after sorting"<<endl;for(int i = 0 ;  i < 50 ; i++){cout<<"array["<<i<<"]="<<array[i]<<endl ; }system("pause") ; delete[ ]array ; array = NULL ; return 0 ;}

0 0
原创粉丝点击