ソートアルゴリズム整理(2)集計ソート

2253 ワード

ソートアルゴリズムを整理する必要があるようですが、ちょうど最近見ている宋力杉の「LINUXワンストッププログラミング」でもいくつかのソートアルゴリズムが取り上げられているので、いくつかの一般的なソートアルゴリズムを書くことにしました.
集計ソートは分治(divide and conquer)の思想を用いた.
現在の配列をソートする場合は、現在の配列の前1/2と後1/2をソートし、それらをマージするだけです.前1/2をソートする場合は、この1/2配列の前1/2とこの1/2配列の1/2をソートしてからマージするだけです.
分割し続けて...
現在の配列の要素の個数が1になったら、これ以上分割できないので、集計を開始します.
//次の2つの関数は、配列を順次印刷するために使用されます.機能は同じで、パラメータは異なります.これは、異なるデータ型の呼び出し要求を容易にするためです.
void print_num_1(uint32_t* arr, uint32_t len){
    for(int i=0;i<len;i++)
        std::cout<<arr[i]<<"\t";
    std::cout<<std::endl;
    return;
}

void print_num_2(int* arr, int len){
    for(int i=0;i<len;i++)
        std::cout<<arr[i]<<"\t";
    std::cout<<std::endl;
    return;
}

以下は私のバージョンのmergesortで、本のバージョンと基本的に似ているので、このバージョンを書きます.
void merge_sort_1(uint32_t* arr, uint32_t st,  uint32_t ed )
{
    uint32_t len_3=ed-st+1;
    uint32_t len_2=0;
    uint32_t len_1=0;
    uint32_t mid=0;
    uint32_t* arr2=new uint32_t[len_3];

    if( st == ed )
    {
       return;
    }else{
       mid=(st+ed)/2;
       merge_sort_1(arr, st, mid);
       merge_sort_1(arr, mid+1, ed);
       len_3=ed-st+1;
       len_2=ed-mid;
       len_1=mid-st+1;
       uint32_t i=0;
       uint32_t j=st;
       uint32_t k=mid+1;

       while((j<mid+1)&&(k<ed+1))   //                   ,ERROR: while((j<len_1)&&(k<len_2)) 
       {
          if(arr[j]<=arr[k]){
              arr2[i++]=arr[j++];
	   // std::cout<<"1 i="<<i<<",arr2[i]="<<arr2[i]<<std::endl;
          }else{
              arr2[i++]=arr[k++];
	   //   std::cout<<"2 i="<<i<<",arr2[i]="<<arr2[i]<<std::endl;
          }
          
       }
       while(j<mid+1)
       {
          arr2[i++]=arr[j++];
       //   std::cout<<"3 i="<<i<<",arr2[i]="<<arr2[2]<<std::endl;
       }
        while(k<ed+1)
       {
           arr2[i++]=arr[k++];
       }
       for (int b=st,k=0;b<=ed;b++,k++)
       {    arr[b]=arr2[k];
       }
       delete [] arr2;
       return;
    }
   
}