2011-10-24 5 views
0

ここでは、merge_sortの例がcprogrammingにあります。クイックソートの文脈でのアルゴリズムを理解するためのアルゴリズムを解読するつもりです。別のSO postmerge_sortのコードの統合

EDIT:

私が更新されました/コードを固定し、下の答えとして、それを投稿しました。これは動作中のmerge_sortです。

答えて

0

ここに掲載されたコードでは、読みやすさの改善が可能です...ここにあります。これが有効なmerge_sortであることを確認しました:

#include "c_arclib.cpp" 
void merge_helper(int *input, int left, int right, int *scratch) 
    { 
    if(right == left + 1) 
    { 
    return; 
    } 
    else 
    { 
    int i = 0; 
    int length = right - left; 
    int midpoint_distance = length/2; 
    int l = left, r = left + midpoint_distance; 
    merge_helper(input, left, left + midpoint_distance, scratch); 
    merge_helper(input, left + midpoint_distance, right, scratch); 
    for(i = 0; i < length; i++) 
     { 
     if((l < (left + midpoint_distance)) && (r == right || input[l] > input[r])) 
     { 
     scratch[i] = input[l]; 
     l++; 
     } 
     else 
     { 
     scratch[i] = input[r]; 
     r++; 
     } 
     } 
    for(i = left; i < right; i++) 
     { 
     input[i] = scratch[i - left]; 
     } 
    } 
    } 
int merge_sort(int *input, int size) 
    { 
    int *scratch = (int *)malloc(size * sizeof(int)); 
    if(scratch != NULL) 
    { 
     merge_helper(input, 0, size, scratch); 
     free(scratch); 
     return 1; 
    } 
    else 
    { 
     return 0; 
    } 
    } 

int main() 
    { 
    int size=1000; 
    int* array = new int[size](); 
    util::rand_to_array(array,size); 
    util::print_array(array, size); 
    merge_sort(array, size); 
    cout << endl; util::print_array(array, size); 
    return 0; 
    } 
関連する問題