ソートアルゴリズム整理(2)集計ソート
2253 ワード
ソートアルゴリズムを整理する必要があるようですが、ちょうど最近見ている宋力杉の「LINUXワンストッププログラミング」でもいくつかのソートアルゴリズムが取り上げられているので、いくつかの一般的なソートアルゴリズムを書くことにしました.
集計ソートは分治(divide and conquer)の思想を用いた.
現在の配列をソートする場合は、現在の配列の前1/2と後1/2をソートし、それらをマージするだけです.前1/2をソートする場合は、この1/2配列の前1/2とこの1/2配列の1/2をソートしてからマージするだけです.
分割し続けて...
現在の配列の要素の個数が1になったら、これ以上分割できないので、集計を開始します.
//次の2つの関数は、配列を順次印刷するために使用されます.機能は同じで、パラメータは異なります.これは、異なるデータ型の呼び出し要求を容易にするためです.
以下は私のバージョンのmergesortで、本のバージョンと基本的に似ているので、このバージョンを書きます.
集計ソートは分治(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;
}
}