![見出し画像](https://assets.st-note.com/production/uploads/images/171290923/rectangle_large_type_2_bb1d4a1485a1694b74e162b6dee28caf.jpeg?width=1200)
解説クラスCopyClear(20)
解説クラスCopyClear(20)
【ソーティング小技】系の関数の解説を行います!
この講義は解説『解説クラスCopyClear(19)』
の続きです!
2025年1月25初講(初稿)
(4-14-103)関数「void SortUpdate(int sw,BYTE buf[],
int size,int d){・・・}」
/************************************************************************/
/***** 1データ更新ソート:データ=BYTE *****/
/************************************************************************/
void CopyClear::SortUpdate(
int sw, // 0:昇順、 1:降順
BYTE buf[], // バッファー
int size, // バッファーサイズ
int d // データ
){
int i; // カウンタ/index
int j; // カウンタ/index
if( size <= 0 ){ // サイズが0以下
return; // 終了
} //
if( sw == 0 ){ // 昇順ソートの場合
if( d >= buf[ size - 1 ] ){ // 範囲外(大きすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d < buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
}else{ // 降順ソートの場合
if( d <= buf[ size - 1 ] ){ // 範囲外(小さすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d > buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
} //
for( j = size - 1; j > i; j-- ){ // 更新位置以降を
buf[j] = buf[j-1]; // 後にずらす
} //
buf[i] = d; // データをセット
}
☆備考☆この関数はファイル「CopyClear100」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
★注意★この関数には、同名で仮引数が異なるオーバーロー
ド(多重定義)関数が存在します!
(A)関数「SortUpdate()」の【関数名】
「Sort」は、勿論、英単語「sort」、カタカナ語ソート・
ソーティング、詰り並び替えです、
「Update」は、勿論、カタカナ語アップデートとして、
ここでは、関数「Sort○○()」で並び替えられた配列に
対して「1データ」を適応した場合に並び替える関数です!
(B)関数「void SortUpdate()」の【返値】
返値を返さない関数です!
★注意★詰り、実引数の検査を実行時に行いませんので
使用する時は、正しい実引数を記載する必要が有ります!
(C)関数「SortUpdate()」の【仮引数】
void CopyClear::SortUpdate(
int sw, // 0:昇順、 1:降順
BYTE buf[], // バッファー
int size, // バッファーサイズ
int d // データ
){
「int sw,」は、「0:昇順、1:降順」と昇順/降順切り替え「BYTE buf[],」は、インデックス配列に依って並び替える
配列!
「BYTE buf[],」は、「BYTE型」=「unsigned char」型と
符号無し1バイト単位データのソート対象一次元配列!
「int size」は、ソート対象一次元配列のデータ数!
「int d」は、アップデートするデータ!
(D)関数「SortUpdate()」の【アルゴリズム】
){
int i; // カウンタ/index
int j; // カウンタ/index
if( size <= 0 ){ // サイズが0以下
return; // 終了
} //
if( sw == 0 ){ // 昇順ソートの場合
if( d >= buf[ size - 1 ] ){ // 範囲外(大きすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d < buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
}else{ // 降順ソートの場合
if( d <= buf[ size - 1 ] ){ // 範囲外(小さすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d > buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
} //
for( j = size - 1; j > i; j-- ){ // 更新位置以降を
buf[j] = buf[j-1]; // 後にずらす
} //
buf[i] = d; // データをセット
}
(D-1)ローカル変数
){
int i; // カウンタ/index
int j; // カウンタ/index
「int i;」は、配列のアップデートする場所を示す添字
「int j;」は、配列データの隙間を開ける為の操作用添字
(D-2)アルゴリズムコード
if( size <= 0 ){ // サイズが0以下
return; // 終了
} //
if( sw == 0 ){ // 昇順ソートの場合
if( d >= buf[ size - 1 ] ){ // 範囲外(大きすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d < buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
}else{ // 降順ソートの場合
if( d <= buf[ size - 1 ] ){ // 範囲外(小さすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d > buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
} //
for( j = size - 1; j > i; j-- ){ // 更新位置以降を
buf[j] = buf[j-1]; // 後にずらす
} //
buf[i] = d; // データをセット
}
「if(size<=0){return;}」は、サイズが0以下なら、何も
セズ関数終了!
「if(sw==0){・・成立中身・・}」は、その成立中身≪昇順
ソートの場合の処理として≫の
「if(d>=buf[size-1]){return;}」は、
条件「d>=buf[size-1]」と仮引数「int d」が、
「buf[size-1]」≪詰り、配列の最後=昇順なので最大値≫
より大きいと昇順ソートへのアップデート出来無いとして
関数終了!
「for(i=0;i<size;i++){if(d<buf[i]){break;}}」は、
forループ「for(i=0;i<size;i++){
・・ループ中身・・}」で配列をサーチし中身
「if(d<buf[i]){break;}」でアップデート可能な場所が、
見つかり「break;」でforループを抜ける!
「else{・・不成立中身・・}」は、その中身≪降順ソートの
場合の処理として≫の
「if(d<=buf[size-1]){return;}」は、
条件「d<=buf[size-1]」と仮引数「int d」が、
「buf[size-1]」≪詰り、配列の最後=降順なので最小値≫
より小さいと降順ソートへのアップデート出来無いとして
関数終了!
「for(i=0;i<size;i++){if(d>buf[i]){break;}}」は、
forループ「for(i=0;i<size;i++){
・・ループ中身・・}」で配列をサーチし中身
「if(d>buf[i]){break;}」でアップデート可能な場所が、
見つかり「break;」でforループを抜ける!
★備考★ここまでで理解して頂いて居ると思うが、
変数「i」にアップデートする場所を示す添字が入ります!
「for(j=size-1;j>i;j--){buf[j]=buf[j-1];}」は、
forループ「for(j=size-1;j>i;j--){・・中身・・}」
で配列の最後「j=size-1;」からアップデートする場所まで
「j>i;j--」と逆順に添え字をカウントダウンし、中身
「buf[j]=buf[j-1];」と一つ後ろに移送します!
「buf[i]=d;」は、空いた場所をアップデートデータを
挿入します!
(4-14-104)関数「void SortUpdate(int sw,short buf[],
int size,int d){・・・}」
/************************************************************************/
/***** 1データ更新ソート:データ=short *****/
/************************************************************************/
void CopyClear::SortUpdate(
int sw, // 0:昇順、 1:降順
short buf[], // バッファー
int size, // バッファーサイズ
int d // データ
){
int i; // カウンタ/index
int j; // カウンタ/index
if( size <= 0 ){ // サイズが0以下
return; // 終了
} //
if( sw == 0 ){ // 昇順ソートの場合
if( d >= buf[ size - 1 ] ){ // 範囲外(大きすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d < buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
}else{ // 降順ソートの場合
if( d <= buf[ size - 1 ] ){ // 範囲外(小さすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d > buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
} //
for( j = size - 1; j > i; j-- ){ // 更新位置以降を
buf[j] = buf[j-1]; // 後にずらす
} //
buf[i] = d; // データをセット
}
☆備考☆この関数はファイル「CopyClear100」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
★注意★この関数には、同名で仮引数が異なるオーバーロー
ド(多重定義)関数が存在します!
(A)関数「SortUpdate()」の【関数名】
「Sort」は、勿論、英単語「sort」、カタカナ語ソート・
ソーティング、詰り並び替えです、
「Update」は、勿論、カタカナ語アップデートとして、
ここでは、関数「Sort○○()」で並び替えられた配列に
対して「1データ」を適応した場合に並び替える関数です!
(B)関数「void SortUpdate()」の【返値】
返値を返さない関数です!
★注意★詰り、実引数の検査を実行時に行いませんので
使用する時は、正しい実引数を記載する必要が有ります!
(C)関数「SortUpdate()」の【仮引数】
void CopyClear::SortUpdate(
int sw, // 0:昇順、 1:降順
short buf[], // バッファー
int size, // バッファーサイズ
int d // データ
){
「int sw,」は、「0:昇順、1:降順」と昇順/降順切り替え「short buf[],」は、インデックス配列に依って並び替える
配列!
「short buf[],」は、「short型」と符号有り2バイト単位
データのソート対象一次元配列!
「int size」は、ソート対象一次元配列のデータ数!
「int d」は、アップデートするデータ!
(D)関数「SortUpdate()」の【アルゴリズム】
){
int i; // カウンタ/index
int j; // カウンタ/index
if( size <= 0 ){ // サイズが0以下
return; // 終了
} //
if( sw == 0 ){ // 昇順ソートの場合
if( d >= buf[ size - 1 ] ){ // 範囲外(大きすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d < buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
}else{ // 降順ソートの場合
if( d <= buf[ size - 1 ] ){ // 範囲外(小さすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d > buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
} //
for( j = size - 1; j > i; j-- ){ // 更新位置以降を
buf[j] = buf[j-1]; // 後にずらす
} //
buf[i] = d; // データをセット
}
(D-1)ローカル変数
「int i;」は、配列のアップデートする場所を示す添字
「int j;」は、配列データの隙間を開ける為の操作用添字
(D-2)アルゴリズムコード
if( size <= 0 ){ // サイズが0以下
return; // 終了
} //
if( sw == 0 ){ // 昇順ソートの場合
if( d >= buf[ size - 1 ] ){ // 範囲外(大きすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d < buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
}else{ // 降順ソートの場合
if( d <= buf[ size - 1 ] ){ // 範囲外(小さすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d > buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
} //
for( j = size - 1; j > i; j-- ){ // 更新位置以降を
buf[j] = buf[j-1]; // 後にずらす
} //
buf[i] = d; // データをセット
}
「if(size<=0){return;}」は、サイズが0以下なら、何も
セズ関数終了!
「if(sw==0){・・成立中身・・}」は、その成立中身≪昇順
ソートの場合の処理として≫の
「if(d>=buf[size-1]){return;}」は、
条件「d>=buf[size-1]」と仮引数「int d」が、
「buf[size-1]」≪詰り、配列の最後=昇順なので最大値≫
より大きいと昇順ソートへのアップデート出来無いとして
関数終了!
「for(i=0;i<size;i++){if(d<buf[i]){break;}}」は、
forループ「for(i=0;i<size;i++){
・・ループ中身・・}」で配列をサーチし中身
「if(d<buf[i]){break;}」でアップデート可能な場所が、
見つかり「break;」でforループを抜ける!
「else{・・不成立中身・・}」は、その中身≪降順ソートの
場合の処理として≫の
「if(d<=buf[size-1]){return;}」は、
条件「d<=buf[size-1]」と仮引数「int d」が、
「buf[size-1]」≪詰り、配列の最後=降順なので最小値≫
より小さいと降順ソートへのアップデート出来無いとして
関数終了!
「for(i=0;i<size;i++){if(d>buf[i]){break;}}」は、
forループ「for(i=0;i<size;i++){
・・ループ中身・・}」で配列をサーチし中身
「if(d>buf[i]){break;}」でアップデート可能な場所が、
見つかり「break;」でforループを抜ける!
★備考★ここまでで理解して頂いて居ると思うが、
変数「i」にアップデートする場所を示す添字が入ります!
「for(j=size-1;j>i;j--){buf[j]=buf[j-1];}」は、
forループ「for(j=size-1;j>i;j--){・・中身・・}」
で配列の最後「j=size-1;」からアップデートする場所まで
「j>i;j--」と逆順に添え字をカウントダウンし、中身
「buf[j]=buf[j-1];」と一つ後ろに移送します!
「buf[i]=d;」は、空いた場所をアップデートデータを
挿入します!
(4-14-105)関数「void SortUpdate(int sw,int buf[],
int size,int d){・・・}」
/************************************************************************/
/***** 1データ更新ソート:データ=int *****/
/************************************************************************/
void CopyClear::SortUpdate(
int sw, // 0:昇順、 1:降順
int buf[], // バッファー
int size, // バッファーサイズ
int d // データ
){
int i; // カウンタ/index
int j; // カウンタ/index
if( size <= 0 ){ // サイズが0以下
return; // 終了
} //
if( sw == 0 ){ // 昇順ソートの場合
if( d >= buf[ size - 1 ] ){ // 範囲外(大きすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d < buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
}else{ // 降順ソートの場合
if( d <= buf[ size - 1 ] ){ // 範囲外(小さすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d > buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
} //
for( j = size - 1; j > i; j-- ){ // 更新位置以降を
buf[j] = buf[j-1]; // 後にずらす
} //
buf[i] = d; // データをセット
}
☆備考☆この関数はファイル「CopyClear100」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
★注意★この関数には、同名で仮引数が異なるオーバーロー
ド(多重定義)関数が存在します!
(A)関数「SortUpdate()」の【関数名】
「Sort」は、勿論、英単語「sort」、カタカナ語ソート・
ソーティング、詰り並び替えです、
「Update」は、勿論、カタカナ語アップデートとして、
ここでは、関数「Sort○○()」で並び替えられた配列に
対して「1データ」を適応した場合に並び替える関数です!
(B)関数「void SortUpdate()」の【返値】
返値を返さない関数です!
★注意★詰り、実引数の検査を実行時に行いませんので
使用する時は、正しい実引数を記載する必要が有ります!
(C)関数「SortUpdate()」の【仮引数】
void CopyClear::SortUpdate(
int sw, // 0:昇順、 1:降順
int buf[], // バッファー
int size, // バッファーサイズ
int d // データ
){
「int sw,」は、「0:昇順、1:降順」と昇順/降順切り替え「int buf[],」は、インデックス配列に依って並び替える
配列!
「int buf[],」は、「int型」と符号有り4バイト単位
データのソート対象一次元配列!
「int size」は、ソート対象一次元配列のデータ数!
「int d」は、アップデートするデータ!
(D)関数「SortUpdate()」の【アルゴリズム】
){
int i; // カウンタ/index
int j; // カウンタ/index
if( size <= 0 ){ // サイズが0以下
return; // 終了
} //
if( sw == 0 ){ // 昇順ソートの場合
if( d >= buf[ size - 1 ] ){ // 範囲外(大きすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d < buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
}else{ // 降順ソートの場合
if( d <= buf[ size - 1 ] ){ // 範囲外(小さすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d > buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
} //
for( j = size - 1; j > i; j-- ){ // 更新位置以降を
buf[j] = buf[j-1]; // 後にずらす
} //
buf[i] = d; // データをセット
}
(D-1)ローカル変数
){
int i; // カウンタ/index
int j; // カウンタ/index
「int i;」は、配列のアップデートする場所を示す添字
「int j;」は、配列データの隙間を開ける為の操作用添字
(D-2)アルゴリズムコード
if( size <= 0 ){ // サイズが0以下
return; // 終了
} //
if( sw == 0 ){ // 昇順ソートの場合
if( d >= buf[ size - 1 ] ){ // 範囲外(大きすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d < buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
}else{ // 降順ソートの場合
if( d <= buf[ size - 1 ] ){ // 範囲外(小さすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d > buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
} //
for( j = size - 1; j > i; j-- ){ // 更新位置以降を
buf[j] = buf[j-1]; // 後にずらす
} //
buf[i] = d; // データをセット
}
「if(size<=0){return;}」は、サイズが0以下なら、何も
セズ関数終了!
「if(sw==0){・・成立中身・・}」は、その成立中身≪昇順
ソートの場合の処理として≫の「if(d>=buf[size-1]){return;}」
は、条件「d>=buf[size-1]」と仮引数「int d」が、
「buf[size-1]」≪詰り、配列の最後=昇順なので最大値≫
より大きいと昇順ソートへのアップデート出来無いとして
関数終了!
「for(i=0;i<size;i++){if(d<buf[i]){break;}}」は、
forループ「for(i=0;i<size;i++){
・・ループ中身・・}」で配列をサーチし中身
「if(d<buf[i]){break;}」でアップデート可能な場所が、
見つかり「break;」でforループを抜ける!
「else{・・不成立中身・・}」は、その中身≪降順ソートの
場合の処理として≫の「if(d<=buf[size-1]){return;}」は、
条件「d<=buf[size-1]」と仮引数「int d」が、
「buf[size-1]」≪詰り、配列の最後=降順なので最小値≫
より小さいと降順ソートへのアップデート出来無いとして
関数終了!
「for(i=0;i<size;i++){if(d>buf[i]){break;}}」は、
forループ「for(i=0;i<size;i++){
・・ループ中身・・}」で配列をサーチし中身
「if(d>buf[i]){break;}」でアップデート可能な場所が、
見つかり「break;」でforループを抜ける!
★備考★ここまでで理解して頂いて居ると思うが、
変数「i」にアップデートする場所を示す添字が入ります!
「for(j=size-1;j>i;j--){buf[j]=buf[j-1];}」は、
forループ「for(j=size-1;j>i;j--){・・中身・・}」
で配列の最後「j=size-1;」からアップデートする場所まで
「j>i;j--」と逆順に添え字をカウントダウンし、中身
「buf[j]=buf[j-1];」と一つ後ろに移送します!
「buf[i]=d;」は、空いた場所をアップデートデータを
挿入します!
(4-14-106)関数「void SortUpdate(int sw,float buf[],
int size,double d){・・・}」
/************************************************************************/
/***** 1データ更新ソート:データ=float *****/
/************************************************************************/
void CopyClear::SortUpdate(
int sw, // 0:昇順、 1:降順
float buf[], // バッファー
int size, // バッファーサイズ
double d // データ
){
int i; // カウンタ/index
int j; // カウンタ/index
if( size <= 0 ){ // サイズが0以下
return; // 終了
} //
if( sw == 0 ){ // 昇順ソートの場合
if( d >= buf[ size - 1 ] ){ // 範囲外(大きすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d < buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
}else{ // 降順ソートの場合
if( d <= buf[ size - 1 ] ){ // 範囲外(小さすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d > buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
} //
for( j = size - 1; j > i; j-- ){ // 更新位置以降を
buf[j] = buf[j-1]; // 後にずらす
} //
buf[i] = (float)d; // データをセット
}
☆備考☆この関数はファイル「CopyClear100」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
★注意★この関数には、同名で仮引数が異なるオーバーロー
ド(多重定義)関数が存在します!
(A)関数「SortUpdate()」の【関数名】
「Sort」は、勿論、英単語「sort」、カタカナ語ソート・
ソーティング、詰り並び替えです、
「Update」は、勿論、カタカナ語アップデートとして、
ここでは、関数「Sort○○()」で並び替えられた配列に
対して「1データ」を適応した場合に並び替える関数です!
(B)関数「void SortUpdate()」の【返値】
返値を返さない関数です!
★注意★詰り、実引数の検査を実行時に行いませんので
使用する時は、正しい実引数を記載する必要が有ります!
(C)関数「SortUpdate()」の【仮引数】
void CopyClear::SortUpdate(
int sw, // 0:昇順、 1:降順
float buf[], // バッファー
int size, // バッファーサイズ
double d // データ
){
「int sw,」は、「0:昇順、1:降順」と昇順/降順切り替え「float buf[],」は、インデックス配列に依って並び替える
配列!
「float buf[],」は、「float型」と単精度浮動小数型
4バイト単位データのソート対象一次元配列!
「int size」は、ソート対象一次元配列のデータ数!
「double d」は、アップデートするデータ!
(D)関数「SortUpdate()」の【アルゴリズム】
){
int i; // カウンタ/index
int j; // カウンタ/index
if( size <= 0 ){ // サイズが0以下
return; // 終了
} //
if( sw == 0 ){ // 昇順ソートの場合
if( d >= buf[ size - 1 ] ){ // 範囲外(大きすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d < buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
}else{ // 降順ソートの場合
if( d <= buf[ size - 1 ] ){ // 範囲外(小さすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d > buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
} //
for( j = size - 1; j > i; j-- ){ // 更新位置以降を
buf[j] = buf[j-1]; // 後にずらす
} //
buf[i] = (float)d; // データをセット
}
(D-1)ローカル変数
){
int i; // カウンタ/index
int j; // カウンタ/index
「int i;」は、配列のアップデートする場所を示す添字
「int j;」は、配列データの隙間を開ける為の操作用添字
(D-2)アルゴリズムコード
if( size <= 0 ){ // サイズが0以下
return; // 終了
} //
if( sw == 0 ){ // 昇順ソートの場合
if( d >= buf[ size - 1 ] ){ // 範囲外(大きすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d < buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
}else{ // 降順ソートの場合
if( d <= buf[ size - 1 ] ){ // 範囲外(小さすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d > buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
} //
for( j = size - 1; j > i; j-- ){ // 更新位置以降を
buf[j] = buf[j-1]; // 後にずらす
} //
buf[i] = (float)d; // データをセット
}
「if(size<=0){return;}」は、サイズが0以下なら、何も
セズ関数終了!
「if(sw==0){・・成立中身・・}」は、その成立中身≪昇順
ソートの場合の処理として≫の「if(d>=buf[size-1]){return;}」
は、条件「d>=buf[size-1]」と仮引数「double d」が、
「buf[size-1]」≪詰り、配列の最後=昇順なので最大値≫
より大きいと昇順ソートへのアップデート出来無いとして
関数終了!
「for(i=0;i<size;i++){if(d<buf[i]){break;}}」は、
forループ「for(i=0;i<size;i++){
・・ループ中身・・}」で配列をサーチし中身
「if(d<buf[i]){break;}」でアップデート可能な場所が、
見つかり「break;」でforループを抜ける!
「else{・・不成立中身・・}」は、その中身≪降順ソートの
場合の処理として≫の「if(d<=buf[size-1]){return;}」は、
条件「d<=buf[size-1]」と仮引数「double d」が、
「buf[size-1]」≪詰り、配列の最後=降順なので最小値≫
より小さいと降順ソートへのアップデート出来無いとして
関数終了!
「for(i=0;i<size;i++){if(d>buf[i]){break;}}」は、
forループ「for(i=0;i<size;i++){
・・ループ中身・・}」で配列をサーチし中身
「if(d>buf[i]){break;}」でアップデート可能な場所が、
見つかり「break;」でforループを抜ける!
★備考★ここまでで理解して頂いて居ると思うが、
変数「i」にアップデートする場所を示す添字が入ります!
「for(j=size-1;j>i;j--){buf[j]=buf[j-1];}」は、
forループ「for(j=size-1;j>i;j--){・・中身・・}」
で配列の最後「j=size-1;」からアップデートする場所まで
「j>i;j--」と逆順に添え字をカウントダウンし、中身
「buf[j]=buf[j-1];」と一つ後ろに移送します!
「buf[i]=(float)d;」は、空いた場所をアップデートデータを
挿入します!
(4-14-107)関数「void SortUpdate(int sw,double buf[],
int size,double d){・・・}」
/************************************************************************/
/***** 1データ更新ソート:データ=double *****/
/************************************************************************/
void CopyClear::SortUpdate(
int sw, // 0:昇順、 1:降順
double buf[], // バッファー
int size, // バッファーサイズ
double d // データ
){
int i; // カウンタ/index
int j; // カウンタ/index
if( size <= 0 ){ // サイズが0以下
return; // 終了
} //
if( sw == 0 ){ // 昇順ソートの場合
if( d >= buf[ size - 1 ] ){ // 範囲外(大きすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d < buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
}else{ // 降順ソートの場合
if( d <= buf[ size - 1 ] ){ // 範囲外(小さすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d > buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
} //
for( j = size - 1; j > i; j-- ){ // 更新位置以降を
buf[j] = buf[j-1]; // 後にずらす
} //
buf[i] = d; // データをセット
}
☆備考☆この関数はファイル「CopyClear100」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
★注意★この関数には、同名で仮引数が異なるオーバーロー
ド(多重定義)関数が存在します!
(A)関数「SortUpdate()」の【関数名】
「Sort」は、勿論、英単語「sort」、カタカナ語ソート・
ソーティング、詰り並び替えです、
「Update」は、勿論、カタカナ語アップデートとして、
ここでは、関数「Sort○○()」で並び替えられた配列に
対して「1データ」を適応した場合に並び替える関数です!
(B)関数「void SortUpdate()」の【返値】
返値を返さない関数です!
★注意★詰り、実引数の検査を実行時に行いませんので
使用する時は、正しい実引数を記載する必要が有ります!
(C)関数「SortUpdate()」の【仮引数】
void CopyClear::SortUpdate(
int sw, // 0:昇順、 1:降順
double buf[], // バッファー
int size, // バッファーサイズ
double d // データ
){
「int sw,」は、「0:昇順、1:降順」と昇順/降順切り替え
「double buf[],」は、インデックス配列に依って並び替える
配列!「double buf[],」は、「double型」と倍精度浮動小数
8バイト単位データのソート対象一次元配列!
「int size」は、ソート対象一次元配列のデータ数!
「double d」は、アップデートするデータ!
(D)関数「SortUpdate()」の【アルゴリズム】
){
int i; // カウンタ/index
int j; // カウンタ/index
if( size <= 0 ){ // サイズが0以下
return; // 終了
} //
if( sw == 0 ){ // 昇順ソートの場合
if( d >= buf[ size - 1 ] ){ // 範囲外(大きすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d < buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
}else{ // 降順ソートの場合
if( d <= buf[ size - 1 ] ){ // 範囲外(小さすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d > buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
} //
for( j = size - 1; j > i; j-- ){ // 更新位置以降を
buf[j] = buf[j-1]; // 後にずらす
} //
buf[i] = d; // データをセット
}
(D-1)ローカル変数
){
int i; // カウンタ/index
int j; // カウンタ/index
「int i;」は、配列のアップデートする場所を示す添字
「int j;」は、配列データの隙間を開ける為の操作用添字
(D-2)アルゴリズムコード
if( size <= 0 ){ // サイズが0以下
return; // 終了
} //
if( sw == 0 ){ // 昇順ソートの場合
if( d >= buf[ size - 1 ] ){ // 範囲外(大きすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d < buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
}else{ // 降順ソートの場合
if( d <= buf[ size - 1 ] ){ // 範囲外(小さすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d > buf[i] ){ // 更新位置発見時
break; // Loop終了
} //
} //
} //
for( j = size - 1; j > i; j-- ){ // 更新位置以降を
buf[j] = buf[j-1]; // 後にずらす
} //
buf[i] = d; // データをセット
}
「if(size<=0){return;}」は、サイズが0以下なら、何も
セズ関数終了!
「if(sw==0){・・成立中身・・}」は、その成立中身≪昇順
ソートの場合の処理として≫の「if(d>=buf[size-1]){return;}」
は、条件「d>=buf[size-1]」と仮引数「double d」が、
「buf[size-1]」≪詰り、配列の最後=昇順なので最大値≫
より大きいと昇順ソートへのアップデート出来無いとして
関数終了!
「for(i=0;i<size;i++){if(d<buf[i]){break;}}」は、
forループ「for(i=0;i<size;i++){
・・ループ中身・・}」で配列をサーチし中身
「if(d<buf[i]){break;}」でアップデート可能な場所が、
見つかり「break;」でforループを抜ける!
「else{・・不成立中身・・}」は、その中身≪降順ソートの
場合の処理として≫の「if(d<=buf[size-1]){return;}」は、
条件「d<=buf[size-1]」と仮引数「double d」が、
「buf[size-1]」≪詰り、配列の最後=降順なので最小値≫
より小さいと降順ソートへのアップデート出来無いとして
関数終了!
「for(i=0;i<size;i++){if(d>buf[i]){break;}}」は、
forループ「for(i=0;i<size;i++){
・・ループ中身・・}」で配列をサーチし中身
「if(d>buf[i]){break;}」でアップデート可能な場所が、
見つかり「break;」でforループを抜ける!
★備考★ここまでで理解して頂いて居ると思うが、
変数「i」にアップデートする場所を示す添字が入ります!
「for(j=size-1;j>i;j--){buf[j]=buf[j-1];}」は、
forループ「for(j=size-1;j>i;j--){・・中身・・}」
で配列の最後「j=size-1;」からアップデートする場所まで
「j>i;j--」と逆順に添え字をカウントダウンし、中身
「buf[j]=buf[j-1];」と一つ後ろに移送します!
「buf[i]=d;」は、空いた場所をアップデートデータを
挿入します!
(4-14-108)関数「void SortUpdate(int sw,
TypeCorr buf[],int size,
double d,int x,int y){・・・}」
/************************************************************************/
/***** 1データ更新ソート:データ=TypeCorr *****/
/************************************************************************/
void CopyClear::SortUpdate(
int sw, // 0:昇順、 1:降順
TypeCorr buf[], // バッファー
int size, // バッファーサイズ
double d, // データ
int x, // X座標
int y // Y座標
){
int i; // カウンタ/index
int j; // カウンタ/index
if( size <= 0 ){ // サイズが0以下
return; // 終了
} //
if( sw == 0 ){ // 昇順ソートの場合
if( d >= buf[ size - 1 ].d ){ // 範囲外(大きすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d < buf[i].d ){ // 更新位置発見時
break; // Loop終了
} //
} //
}else{ // 降順ソートの場合
if( d <= buf[ size - 1 ].d ){ // 範囲外(小さすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d > buf[i].d ){ // 更新位置発見時
break; // Loop終了
} //
} //
} //
for( j = size - 1; j > i; j-- ){ // 更新位置以降を
buf[j] = buf[j-1]; // 後にずらす
} //
buf[i].d = d; // データをセット
buf[i].x = x; //
buf[i].y = y; //
}
☆備考☆この関数はファイル「CopyClear100」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
★注意★この関数には、同名で仮引数が異なるオーバーロー
ド(多重定義)関数が存在します!
(A)関数「SortUpdate()」の【関数名】
「Sort」は、勿論、英単語「sort」、カタカナ語ソート・
ソーティング、詰り並び替えです、
「Update」は、勿論、カタカナ語アップデートとして、
ここでは、関数「Sort○○()」で並び替えられた配列に
対して「1データ」を適応した場合に並び替える関数です!
(B)関数「void SortUpdate()」の【返値】
返値を返さない関数です!
★注意★詰り、実引数の検査を実行時に行いませんので
使用する時は、正しい実引数を記載する必要が有ります!
(C)関数「SortUpdate()」の【仮引数】
void CopyClear::SortUpdate(
int sw, // 0:昇順、 1:降順
TypeCorr buf[], // バッファー
int size, // バッファーサイズ
double d, // データ
int x, // X座標
int y // Y座標
){
「int sw,」は、「0:昇順、1:降順」と昇順/降順切り替え
「TypeCorr buf[],」は、インデックス配列に依って並び替える
配列!「TypeCorr buf[],」は、「TypeCorr型」と
「相関値+座標組型」≪解説『解説クラスSupport』
の中で「(2)構造体「struct構文で定義」したデータ
構造」の更に「(2-6)相関値+座標」で説明?!≫の
データのソート対象一次元配列!
「int size」は、ソート対象一次元配列のデータ数!
「double d」は、アップデートする相関値のデータ!
「int x,」は、アップデートするX座標のデータ!
「int y 」は、アップデートするY座標のデータ!
(D)関数「SortUpdate()」の【アルゴリズム】
){
int i; // カウンタ/index
int j; // カウンタ/index
if( size <= 0 ){ // サイズが0以下
return; // 終了
} //
if( sw == 0 ){ // 昇順ソートの場合
if( d >= buf[ size - 1 ].d ){ // 範囲外(大きすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d < buf[i].d ){ // 更新位置発見時
break; // Loop終了
} //
} //
}else{ // 降順ソートの場合
if( d <= buf[ size - 1 ].d ){ // 範囲外(小さすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d > buf[i].d ){ // 更新位置発見時
break; // Loop終了
} //
} //
} //
for( j = size - 1; j > i; j-- ){ // 更新位置以降を
buf[j] = buf[j-1]; // 後にずらす
} //
buf[i].d = d; // データをセット
buf[i].x = x; //
buf[i].y = y; //
}
(D-1)ローカル変数
){
int i; // カウンタ/index
int j; // カウンタ/index
「int i;」は、配列のアップデートする場所を示す添字
「int j;」は、配列データの隙間を開ける為の操作用添字
(D-2)アルゴリズムコード
if( size <= 0 ){ // サイズが0以下
return; // 終了
} //
if( sw == 0 ){ // 昇順ソートの場合
if( d >= buf[ size - 1 ].d ){ // 範囲外(大きすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d < buf[i].d ){ // 更新位置発見時
break; // Loop終了
} //
} //
}else{ // 降順ソートの場合
if( d <= buf[ size - 1 ].d ){ // 範囲外(小さすぎる)
return; // 終了
} //
for( i = 0; i < size; i++ ){ // バッファー内で
if( d > buf[i].d ){ // 更新位置発見時
break; // Loop終了
} //
} //
} //
for( j = size - 1; j > i; j-- ){ // 更新位置以降を
buf[j] = buf[j-1]; // 後にずらす
} //
buf[i].d = d; // データをセット
buf[i].x = x; //
buf[i].y = y; //
}
「if(size<=0){return;}」は、サイズが0以下なら、何も
セズ関数終了!
「if(sw==0){・・成立中身・・}」は、その成立中身≪昇順
ソートの場合の処理として≫の「if(d>=buf[size-1].d){return;}」
は、条件「d>=buf[size-1].d」と仮引数「double d」が、
「buf[size-1].d」≪詰り、配列の最後=昇順なので最大値≫
より大きいと昇順ソートへのアップデート出来無いとして
関数終了!
「for(i=0;i<size;i++){if(d<buf[i].d){break;}}」は、
forループ「for(i=0;i<size;i++){
・・ループ中身・・}」で配列をサーチし中身
「if(d<buf[i].d){break;}」でアップデート可能な場所が、
見つかり「break;」でforループを抜ける!
「else{・・不成立中身・・}」は、その中身≪降順ソートの
場合の処理として≫の「if(d<=buf[size-1].d){return;}」は、
条件「d<=buf[size-1].d」と仮引数「double d」が、
「buf[size-1].d」≪詰り、配列の最後=降順なので最小値≫
より小さいと降順ソートへのアップデート出来無いとして
関数終了!
「for(i=0;i<size;i++){if(d>buf[i].d.d){break;}}」は、
forループ「for(i=0;i<size;i++){
・・ループ中身・・}」で配列をサーチし中身
「if(d>buf[i].d){break;}」でアップデート可能な場所が、
見つかり「break;」でforループを抜ける!
★備考★ここまでで理解して頂いて居ると思うが、
変数「i」にアップデートする場所を示す添字が入ります!
「for(j=size-1;j>i;j--){buf[j]=buf[j-1].d;}」は、
forループ「for(j=size-1;j>i;j--){・・中身・・}」
で配列の最後「j=size-1;」からアップデートする場所まで
「j>i;j--」と逆順に添え字をカウントダウンし、中身
「buf[j]=buf[j-1];」と一つ後ろに移送します!
「buf[i].d=d;buf[i].x=x;buf[i].y=y;」は、空いた場所を
アップデートデータを挿入します!
(4-14-109)関数「void SortMerge(int sw,
BYTE buf1[],BYTE buf2[],
BYTE buf[],int size1,int size2) {・・・}」
/************************************************************************/
/***** 併合ソート:データ=BYTE *****/
/***** 「buf1」、「buf2」共「sw」で指定したソート済みが条件 *****/
/************************************************************************/
void CopyClear::SortMerge(
int sw, // 0:昇順、 1:降順
BYTE buf1[], // バッファー:1
BYTE buf2[], // バッファー:2
BYTE buf[], // バッファー:格納先
int size1, // バッファーサイズ:1
int size2 // バッファーサイズ:2
){
int size; // バッファーサイズ
int i; // カウンタ:格納
int j; // カウンタ:1
int k; // カウンタ:2
size = size1 + size2; // 総サイズ算出
if( sw == 0 ){ // 昇順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] <= buf2[k] ){ // 「1」側が小なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が大なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
}else{ // 降順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] >= buf2[k] ){ // 「1」側が大なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が小なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
} //
}
☆備考☆この関数はファイル「CopyClear100」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
★注意★この関数には、同名で仮引数が異なるオーバーロー
ド(多重定義)関数が存在します!
(A)関数「SortMerge()」の【関数名】
「Sort」は、勿論、英単語「sort」、カタカナ語ソート・
ソーティング、詰り並び替えです、
「Merge」は、英語「merge」、「併合する、溶け合わせる」
です!ソーティングアルゴリズムとしては、マージソート≪
元々、古いコンピュータシステム(補助記憶装置が磁気テー
プ)で磁気テープのデータをマージする事で長大なソート済
みの2本の磁気テープから両方のデータを併合し一本のソー
ト済データを作成する事で考えられた、2本のソート済デー
タから1本の連続するソートデータを作成するソート方法≫
です!
(B)関数「void SortMerge()」の【返値】
返値を返さない関数です!
★注意★詰り、実引数の検査を実行時に行いませんので
使用する時は、正しい実引数を記載する必要が有ります!
(C)関数「SortMerge()」の【仮引数】
void CopyClear::SortMerge(
int sw, // 0:昇順、 1:降順
BYTE buf1[], // バッファー:1
BYTE buf2[], // バッファー:2
BYTE buf[], // バッファー:格納先
int size1, // バッファーサイズ:1
int size2 // バッファーサイズ:2
){
「int sw,」は、「0:昇順、1:降順」と昇順/降順切り替え
「BYTE buf1[],」は、1本目のソート済データ配列
「BYTE buf2[],」は、2本目のソート済データ配列
「BYTE buf[],」は、併合処理した結果のデータ配列
この関数は、配列が全て「BYTE型」、1バイト整数型です!
「int size1,」は、1本目のソート対象一次元配列の
データ数!
「int size2」は、2本目のソート対象一次元配列のデータ
数!
(D)関数「SortMerge()」の【アルゴリズム】
){
int size; // バッファーサイズ
int i; // カウンタ:格納
int j; // カウンタ:1
int k; // カウンタ:2
size = size1 + size2; // 総サイズ算出
if( sw == 0 ){ // 昇順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] <= buf2[k] ){ // 「1」側が小なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が大なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
}else{ // 降順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] >= buf2[k] ){ // 「1」側が大なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が小なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
} //
}
(D-1)ローカル変数
){
int size; // バッファーサイズ
int i; // カウンタ:格納
int j; // カウンタ:1
int k; // カウンタ:2
「int size;」は、結果バッファーのサイズ
「int i;」は、結果配列の添え字&ループ用カウンタ
「int j;」は、1本目の配列の添え字
「int k;」は、2本目の配列の添え字
(D-2)アルゴリズムコード
size = size1 + size2; // 総サイズ算出
if( sw == 0 ){ // 昇順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] <= buf2[k] ){ // 「1」側が小なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が大なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
}else{ // 降順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] >= buf2[k] ){ // 「1」側が大なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が小なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
} //
}
「size=size1+size2;」は、結果バッファーのサイズ算出!
「if(sw==0){・・成立中身・・}」は、その成立中身≪昇順
ソートの場合の処理として≫の
「for(i=0,j=0,k=0;i<size;i++){・・
中身・・}」は、forループ初期値「i=0,j=0,k=0;」で
結果配列用・1本目配列・2本目配列を0に初期化、ループ
条件「i<size;」と結果配列用添え字が結果のサイズ以内に
収まる様にループし、ループ中身「if(buf1[j]<=buf2[k]){
・・条件成立中身・・}」は、内側if条件
「buf1[j]<=buf2[k]」、詰り1本目の配列の注視点≪添え
字「j」で特定≫が、2本目の配列の注視点≪添え字「k」で
特定≫以下の値の場合、内側if成立中身「
buf[i]=buf1[j];j++;if(j>=size1){内側if成立中身}
return;}」と「buf[i]=buf1[j];j++;」で結果配列に
1本目の注視点を格納し、1本目配列の注視点添え字を
「j++;」と次へ移動、そして「if(j>=size1){・・内側
ループ・・}return;}」、コレは、最奥のif条件
「j>=size1」と1本目の注視点の添え字が配列の範囲内なら
最奥のif条件成立「・・内側forループ・・」と最奥
forループ「for(i++;i<size;i++,k++){
buf[i]=buf2[k];}」でループ条件「i<size」と最後まで
「buf[i]=buf2[k];」で2本目のデータ配列を「k++」と
2本目の注視点添え字を次へ進めながら結果配列にコピーし
「return;」と関数を終了!
内側if「buf1[j]<=buf2[k]){」に対する不成立「
else{・・}」の「buf[i]=buf2[k];k++;」と結果配列に
2本目の注視点を格納し、2本目配列の注視点添え字を
「k++;」と次へ移動、そして「if(k>=size2){・・最奥成立
・・}return;」と、コレは、最奥のif条件
「k>=size2」と2本目の注視点の添え字が配列の範囲内
なら最奥のif条件成立「・・内側forループ・・」と
最奥forループ「for(i++;i<size;i++,j++){
buf[i]=buf1[j];}」でループ条件「i<size」と最後まで
「buf[i]=buf1[j];」で1本目のデータ配列を「j++」と
1本目の注視点添え字を次へ進めながら結果配列にコピーし
「return;」と関数を終了!
外側の「else{・・不成立中身・・}」は、その中身≪降順
ソートの場合の処理として≫の
「for(i=0,j=0,k=0;i<size;i++){・・
中身・・}」は、forループ初期値「i=0,j=0,k=0;」で
結果配列用・1本目配列・2本目配列を0に初期化、ループ
条件「i<size;」と結果配列用添え字が結果のサイズ以内に
収まる様にループし、ループ中身「if(buf1[j]>=buf2[k]){
・・条件成立中身・・}」は、内側if条件
「buf1[j]>=buf2[k]」、詰り1本目の配列の注視点≪添え
字「j」で特定≫が、2本目の配列の注視点≪添え字「k」で
特定≫以下の値の場合、内側if成立中身「
buf[i]=buf1[j];j++;if(j>=size1){内側if成立中身}
return;}」と「buf[i]=buf1[j];j++;」で結果配列に
1本目の注視点を格納し、1本目配列の注視点添え字を
「j++;」と次へ移動、そして「if(j>=size1){・・内側
ループ・・}return;}」、コレは、最奥のif条件
「j>=size1」と1本目の注視点の添え字が配列の範囲内なら
最奥のif条件成立「・・内側forループ・・」と最奥
forループ「for(i++;i<size;i++,k++){
buf[i]=buf2[k];}」でループ条件「i<size」と最後まで
「buf[i]=buf2[k];」で2本目のデータ配列を「k++」と
2本目の注視点添え字を次へ進めながら結果配列にコピーし
「return;」と関数を終了!
内側if「buf1[j]>=buf2[k]){」に対する不成立「
else{・・}」の「buf[i]=buf2[k];k++;」と結果配列に
2本目の注視点を格納し、2本目配列の注視点添え字を
「k++;」と次へ移動、そして「if(k>=size2){・・最奥成立
・・}return;」と、コレは、最奥のif条件
「k>=size2」と2本目の注視点の添え字が配列の範囲内
なら最奥のif条件成立「・・内側forループ・・」と
最奥forループ「for(i++;i<size;i++,j++){
buf[i]=buf1[j];}」でループ条件「i<size」と最後まで
「buf[i]=buf1[j];」で1本目のデータ配列を「j++」と
1本目の注視点添え字を次へ進めながら結果配列にコピーし
「return;」と関数を終了!
★備考★自然言語「日本語」でC言語で多重に入り組んだ
ブロック構造のアルゴリズムを解説してみました?!正直、
読者の皆様の理解の役に立ったか如何か自信有りません!
寧ろ、C言語コードの右側のコメントを参考にして読み解い
た方が簡単かもしれません!アルゴリズム自体は、明確に
ルールの決まって居るコンピュータ言語の方が判り易いと
思います!
(4-14-110)関数「void SortMerge(int sw,
short buf1[],short buf2[],
short buf[],int size1,int size2) {・・・}」
/************************************************************************/
/***** 併合ソート:データ=short *****/
/***** 「buf1」、「buf2」共「sw」で指定したソート済みが条件 *****/
/************************************************************************/
void CopyClear::SortMerge(
int sw, // 0:昇順、 1:降順
short buf1[], // バッファー:1
short buf2[], // バッファー:2
short buf[], // バッファー:格納先
int size1, // バッファーサイズ:1
int size2 // バッファーサイズ:2
){
int size; // バッファーサイズ
int i; // カウンタ:格納
int j; // カウンタ:1
int k; // カウンタ:2
size = size1 + size2; // 総サイズ算出
if( sw == 0 ){ // 昇順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] <= buf2[k] ){ // 「1」側が小なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が大なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
}else{ // 降順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] >= buf2[k] ){ // 「1」側が大なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が小なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
} //
}
☆備考☆この関数はファイル「CopyClear100」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
★注意★この関数には、同名で仮引数が異なるオーバーロー
ド(多重定義)関数が存在します!
(A)関数「SortMerge()」の【関数名】
「Sort」は、勿論、英単語「sort」、カタカナ語ソート・
ソーティング、詰り並び替えです、
「Merge」は、英語「merge」、「併合する、溶け合わせる」
です!ソーティングアルゴリズムとしては、マージソート≪
元々、古いコンピュータシステム(補助記憶装置が磁気テー
プ)で磁気テープのデータをマージする事で長大なソート済
みの2本の磁気テープから両方のデータを併合し一本のソー
ト済データを作成する事で考えられた、2本のソート済デー
タから1本の連続するソートデータを作成するソート方法≫
です!
(B)関数「void SortMerge()」の【返値】
返値を返さない関数です!
★注意★詰り、実引数の検査を実行時に行いませんので
使用する時は、正しい実引数を記載する必要が有ります!
(C)関数「SortMerge()」の【仮引数】
void CopyClear::SortMerge(
int sw, // 0:昇順、 1:降順
short buf1[], // バッファー:1
short buf2[], // バッファー:2
short buf[], // バッファー:格納先
int size1, // バッファーサイズ:1
int size2 // バッファーサイズ:2
){
「int sw,」は、「0:昇順、1:降順」と昇順/降順切り替え
「short buf1[],」は、1本目のソート済データ配列
「short buf2[],」は、2本目のソート済データ配列
「short buf[],」は、併合処理した結果のデータ配列
この関数は、配列が全て「short型」、2バイト整数型です!
「int size1,」は、1本目のソート対象一次元配列の
データ数!
「int size2」は、2本目のソート対象一次元配列のデータ
数!
(D)関数「SortMerge()」の【アルゴリズム】
){
int size; // バッファーサイズ
int i; // カウンタ:格納
int j; // カウンタ:1
int k; // カウンタ:2
size = size1 + size2; // 総サイズ算出
if( sw == 0 ){ // 昇順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] <= buf2[k] ){ // 「1」側が小なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が大なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
}else{ // 降順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] >= buf2[k] ){ // 「1」側が大なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が小なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
} //
}
(D-1)ローカル変数
){
int size; // バッファーサイズ
int i; // カウンタ:格納
int j; // カウンタ:1
int k; // カウンタ:2
「int size;」は、結果バッファーのサイズ
「int i;」は、結果配列の添え字&ループ用カウンタ
「int j;」は、1本目の配列の添え字
「int k;」は、2本目の配列の添え字
(D-2)アルゴリズムコード
size = size1 + size2; // 総サイズ算出
if( sw == 0 ){ // 昇順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] <= buf2[k] ){ // 「1」側が小なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が大なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
}else{ // 降順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] >= buf2[k] ){ // 「1」側が大なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が小なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
} //
}
「size=size1+size2;」は、結果バッファーのサイズ算出!
★備考★ここまでの記述は、(4-14-109のD)と
同じです!更に言えば、この(4-14-109のD)の
アルゴリズムコードは、(4-14-109のD)と全く同
じです!今回は、(4-14-10109のD)の日本語での
説明が私的に納得出来無いので別の説明アプローチをさせて
貰います!
(1)全体
if( sw == 0 ){
・・昇順ソート処理・・
}else{
・・降順ソート処理・・
}
(2)昇順ソート処理
「for(i=0,j=0,k=0;i<size;i++){・外側ループ中身・}」は、
forループ構文「for(i=0,j=0,k=0;i<size;i++)」で
初期化「i=0,j=0,k=0;」と結果と元の二本の配列添え字を
0クリアし、ループ条件「i<size;」と結果配列への添え字
をループカウンタとしてサイズ目一杯、そしてループ本体後
処理「i++」と結果配列添え字を進める
(2-1)外側ループ中身の処理
if分岐構文「if(buf1[j]<=buf2[k]){・・成立・・}else{
・・不成立・・」と成り、条件「buf1[j]<=buf2[k]」と
1本目配列≪これから配列1と呼称≫の注視点が2本目配列
≪これから配列2と呼称≫の注視点以下の場合を成立
(2-1-1)成立の処理
「buf[i]=buf1[j];j++;」で結果配列に配列1の注視点を
コピーし、配列1添え字を進める!
最奥のif分岐構文「if(j>=size1){・・最奥成立・・}」
条件「j>=size1」で配列1添え字が最後に到達した場合
(2-1-1-1)最奥成立の処理
「for(i++;i<size;i++,k++){buf[i]=buf2[k];}return;」と
最奥の内側ループでforループ構文「for(i++;i<size;
i++,k++)」で初期化「i++;」と結果配列添え字を進め、
ループ条件「i<size」と結果配列への添え字をループカウ
ンタとしてサイズ目一杯、そしてループ本体後処理「
i++,k++」と結果配列添え字と配列2添え字を進め、
最奥の内側ループ処理本体で「buf[i]=buf2[k];」と
結果配列に配列2の注視点をコピーし、配列2添え字を
進め(★備考★これはループ本体後処理)る!そして
「return;」で関数終了!
(2-1-2)不成立の処理
「buf[i]=buf2[k];k++;」で結果配列に配列2の注視点を
コピーし、配列2添え字を進める!
最奥のif分岐構文「if(k>=size2){){・・最奥成立・・}」
条件「k>=size2」で配列2添え字が最後に到達した場合
(2-1-2-1)最奥成立の処理
「for(i++;i<size;i++,j++){buf[i]=buf1[j];}return;」と
最奥の内側ループでforループ構文「for(i++;i<size;
i++,k++)」で初期化「i++;」と結果配列添え字を進め、
ループ条件「i<size」と結果配列への添え字をループカウ
ンタとしてサイズ目一杯、そしてループ本体後処理「
i++,j++」と結果配列添え字と配列1添え字を進め、
最奥の内側ループ処理本体で「buf[i]=buf1[j];」と
結果配列に配列2の注視点をコピーし、配列2添え字を
進め(★備考★これはループ本体後処理)る!そして
「return;」で関数終了!
(3)降順ソート処理
「for(i=0,j=0,k=0;i<size;i++){・外側ループ中身・}」は、
forループ構文「for(i=0,j=0,k=0;i<size;i++)」で
初期化「i=0,j=0,k=0;」と結果と元の二本の配列添え字を
0クリアし、ループ条件「i<size;」と結果配列への添え字
をループカウンタとしてサイズ目一杯、そしてループ本体後
処理「i++」と結果配列添え字を進める
(3-1)外側ループ中身の処理
if分岐構文「if(buf1[j]>=buf2[k]){・・成立・・}else{
・・不成立・・」と成り、条件「buf1[j]>=buf2[k]」と
配列1の注視点が配列2の注視点以下の場合を成立
(3-1-1)成立の処理
「buf[i]=buf1[j];j++;」で結果配列に配列1の注視点を
コピーし、配列1添え字を進める!
最奥のif分岐構文「if(j>=size1){・・最奥成立・・}」
条件「j>=size1」で配列1添え字が最後に到達した場合
(3-1-1-1)最奥成立の処理
「for(i++;i<size;i++,k++){buf[i]=buf2[k];}return;」と
最奥の内側ループでforループ構文「for(i++;i<size;
i++,k++)」で初期化「i++;」と結果配列添え字を進め、
ループ条件「i<size」と結果配列への添え字をループカウ
ンタとしてサイズ目一杯、そしてループ本体後処理「
i++,k++」と結果配列添え字と配列2添え字を進め、
最奥の内側ループ処理本体で「buf[i]=buf2[k];」と
結果配列に配列2の注視点をコピーし、配列2添え字を
進め(★備考★これはループ本体後処理)る!そして
「return;」で関数終了!
(3-1-2)不成立の処理
「buf[i]=buf2[k];k++;」で結果配列に配列2の注視点を
コピーし、配列2添え字を進める!
最奥のif分岐構文「if(k>=size2){){・・最奥成立・・}」
条件「k>=size2」で配列2添え字が最後に到達した場合
(3-1-2-1)最奥成立の処理
「for(i++;i<size;i++,j++){buf[i]=buf1[j];}return;」と
最奥の内側ループでforループ構文「for(i++;i<size;
i++,k++)」で初期化「i++;」と結果配列添え字を進め、
ループ条件「i<size」と結果配列への添え字をループカウ
ンタとしてサイズ目一杯、そしてループ本体後処理「
i++,j++」と結果配列添え字と配列1添え字を進め、
最奥の内側ループ処理本体で「buf[i]=buf1[j];」と
結果配列に配列2の注視点をコピーし、配列2添え字を
進め(★備考★これはループ本体後処理)る!そして
「return;」で関数終了!
(4-14-111)関数「void SortMerge(int sw,int buf1[],
int buf2[],int buf[],int size1,
int size2) {・・・}」
/************************************************************************/
/***** 併合ソート:データ=int *****/
/***** 「buf1」、「buf2」共「sw」で指定したソート済みが条件 *****/
/************************************************************************/
void CopyClear::SortMerge(
int sw, // 0:昇順、 1:降順
int buf1[], // バッファー:1
int buf2[], // バッファー:2
int buf[], // バッファー:格納先
int size1, // バッファーサイズ:1
int size2 // バッファーサイズ:2
){
int size; // バッファーサイズ
int i; // カウンタ:格納
int j; // カウンタ:1
int k; // カウンタ:2
size = size1 + size2; // 総サイズ算出
if( sw == 0 ){ // 昇順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] <= buf2[k] ){ // 「1」側が小なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が大なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
}else{ // 降順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] >= buf2[k] ){ // 「1」側が大なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が小なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
} //
}
☆備考☆この関数はファイル「CopyClear100」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
★注意★この関数には、同名で仮引数が異なるオーバーロー
ド(多重定義)関数が存在します!
(A)関数「SortMerge()」の【関数名】
「Sort」は、勿論、英単語「sort」、カタカナ語ソート・
ソーティング、詰り並び替えです、
「Merge」は、英語「merge」、「併合する、溶け合わせる」
です!ソーティングアルゴリズムとしては、マージソート≪
元々、古いコンピュータシステム(補助記憶装置が磁気テー
プ)で磁気テープのデータをマージする事で長大なソート済
みの2本の磁気テープから両方のデータを併合し一本のソー
ト済データを作成する事で考えられた、2本のソート済デー
タから1本の連続するソートデータを作成するソート方法≫
です!
(B)関数「void SortMerge()」の【返値】
返値を返さない関数です!
★注意★詰り、実引数の検査を実行時に行いませんので
使用する時は、正しい実引数を記載する必要が有ります!
(C)関数「SortMerge()」の【仮引数】
void CopyClear::SortMerge(
int sw, // 0:昇順、 1:降順
int buf1[], // バッファー:1
int buf2[], // バッファー:2
int buf[], // バッファー:格納先
int size1, // バッファーサイズ:1
int size2 // バッファーサイズ:2
){
「int sw,」は、「0:昇順、1:降順」と昇順/降順切り替え
「int buf1[],」は、1本目のソート済データ配列
「int buf2[],」は、2本目のソート済データ配列
「int buf[],」は、併合処理した結果のデータ配列
この関数は、配列が全て「int型」、4バイト整数型です!
「int size1,」は、1本目のソート対象一次元配列の
データ数!
「int size2」は、2本目のソート対象一次元配列のデータ
数!
(D)関数「SortMerge()」の【アルゴリズム】
){
int size; // バッファーサイズ
int i; // カウンタ:格納
int j; // カウンタ:1
int k; // カウンタ:2
size = size1 + size2; // 総サイズ算出
if( sw == 0 ){ // 昇順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] <= buf2[k] ){ // 「1」側が小なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が大なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
}else{ // 降順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] >= buf2[k] ){ // 「1」側が大なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が小なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
} //
}
(D-1)ローカル変数
){
int size; // バッファーサイズ
int i; // カウンタ:格納
int j; // カウンタ:1
int k; // カウンタ:2
「int size;」は、結果バッファーのサイズ
「int i;」は、結果配列の添え字&ループ用カウンタ
「int j;」は、1本目の配列の添え字
「int k;」は、2本目の配列の添え字
(D-2)アルゴリズムコード
size = size1 + size2; // 総サイズ算出
if( sw == 0 ){ // 昇順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] <= buf2[k] ){ // 「1」側が小なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が大なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
}else{ // 降順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] >= buf2[k] ){ // 「1」側が大なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が小なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
} //
}
「size=size1+size2;」は、結果バッファーのサイズ算出!
★備考★ここまでの記述は、(4-14-109のD)と
同じです!更に言えば、この(4-14-111のD)の
アルゴリズムコードは、(4-14-109のD)と全く同
じです!今回は、(4-14-10109のDの日本語での
説明が私的に納得出来無いので別の説明アプローチをさせて
貰います!
(1)全体
if( sw == 0 ){
・・昇順ソート処理・・
}else{
・・降順ソート処理・・
}
(2)昇順ソート処理
「for(i=0,j=0,k=0;i<size;i++){・外側ループ中身・}」は、
forループ構文「for(i=0,j=0,k=0;i<size;i++)」で
初期化「i=0,j=0,k=0;」と結果と元の二本の配列添え字を
0クリアし、ループ条件「i<size;」と結果配列への添え字
をループカウンタとしてサイズ目一杯、そしてループ本体後
処理「i++」と結果配列添え字を進める
(2-1)外側ループ中身の処理
if分岐構文「if(buf1[j]<=buf2[k]){・・成立・・}else{
・・不成立・・」と成り、条件「buf1[j]<=buf2[k]」と
1本目配列≪これから配列1と呼称≫の注視点が2本目配列
≪これから配列2と呼称≫の注視点以下の場合を成立
(2-1-1)成立の処理
「buf[i]=buf1[j];j++;」で結果配列に配列1の注視点を
コピーし、配列1添え字を進める!
最奥のif分岐構文「if(j>=size1){・・最奥成立・・}」
条件「j>=size1」で配列1添え字が最後に到達した場合
(2-1-1-1)最奥成立の処理
「for(i++;i<size;i++,k++){buf[i]=buf2[k];}return;」と
最奥の内側ループでforループ構文「for(i++;i<size;
i++,k++)」で初期化「i++;」と結果配列添え字を進め、
ループ条件「i<size」と結果配列への添え字をループカウ
ンタとしてサイズ目一杯、そしてループ本体後処理「
i++,k++」と結果配列添え字と配列2添え字を進め、
最奥の内側ループ処理本体で「buf[i]=buf2[k];」と
結果配列に配列2の注視点をコピーし、配列2添え字を
進め(★備考★これはループ本体後処理)る!そして
「return;」で関数終了!
(2-1-2)不成立の処理
「buf[i]=buf2[k];k++;」で結果配列に配列2の注視点を
コピーし、配列2添え字を進める!
最奥のif分岐構文「if(k>=size2){){・・最奥成立・・}」
条件「k>=size2」で配列2添え字が最後に到達した場合
(2-1-2-1)最奥成立の処理
「for(i++;i<size;i++,j++){buf[i]=buf1[j];}return;」と
最奥の内側ループでforループ構文「for(i++;i<size;
i++,k++)」で初期化「i++;」と結果配列添え字を進め、
ループ条件「i<size」と結果配列への添え字をループカウ
ンタとしてサイズ目一杯、そしてループ本体後処理「
i++,j++」と結果配列添え字と配列1添え字を進め、
最奥の内側ループ処理本体で「buf[i]=buf1[j];」と
結果配列に配列2の注視点をコピーし、配列2添え字を
進め(★備考★これはループ本体後処理)る!そして
「return;」で関数終了!
(3)降順ソート処理
★備考★今回は、(4-14-110のD)の説明記載が
長過ぎてウンザリしたと考えて要約します!
ここの降順ソート処理が(2)昇順ソート処理との相違点
は、昇順ソートでの≪if分岐構文「if(buf1[j]<=buf2[k]
){・・成立・・}else{・・不成立・・」と成り、条件「
buf1[j]<=buf2[k]」の条件≫が、降順ソートの場合は、
≪if分岐構文「if(buf1[j]>=buf2[k]){・・成立・・}
else{・・不成立・・」と成り、
条件「buf1[j]>=buf2[k]」の条件≫に成る、≪「<=」が、
「<=」に変更≫⇒勿論、昇順≪小から大へ≫が降順≪大から
小へ≫の違いとは理解して頂けると思います!
(4-14-112)関数「void SortMerge(int sw,float buf1[],
float buf2[],float buf[],int size1,
int size2) {・・・}」
/************************************************************************/
/***** 併合ソート:データ=float *****/
/***** 「buf1」、「buf2」共「sw」で指定したソート済みが条件 *****/
/************************************************************************/
void CopyClear::SortMerge(
int sw, // 0:昇順、 1:降順
float buf1[], // バッファー:1
float buf2[], // バッファー:2
float buf[], // バッファー:格納先
int size1, // バッファーサイズ:1
int size2 // バッファーサイズ:2
){
int size; // バッファーサイズ
int i; // カウンタ:格納
int j; // カウンタ:1
int k; // カウンタ:2
size = size1 + size2; // 総サイズ算出
if( sw == 0 ){ // 昇順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] <= buf2[k] ){ // 「1」側が小なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が大なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
}else{ // 降順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] >= buf2[k] ){ // 「1」側が大なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が小なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
} //
}
☆備考☆この関数はファイル「CopyClear100」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
★注意★この関数には、同名で仮引数が異なるオーバーロー
ド(多重定義)関数が存在します!
(A)関数「SortMerge()」の【関数名】
「Sort」は、勿論、英単語「sort」、カタカナ語ソート・
ソーティング、詰り並び替えです、
「Merge」は、英語「merge」、「併合する、溶け合わせる」
です!ソーティングアルゴリズムとしては、マージソート≪
元々、古いコンピュータシステム(補助記憶装置が磁気テー
プ)で磁気テープのデータをマージする事で長大なソート済
みの2本の磁気テープから両方のデータを併合し一本のソー
ト済データを作成する事で考えられた、2本のソート済デー
タから1本の連続するソートデータを作成するソート方法≫
です!
(B)関数「void SortMerge()」の【返値】
返値を返さない関数です!
★注意★詰り、実引数の検査を実行時に行いませんので
使用する時は、正しい実引数を記載する必要が有ります!
(C)関数「SortMerge()」の【仮引数】
void CopyClear::SortMerge(
int sw, // 0:昇順、 1:降順
float buf1[], // バッファー:1
float buf2[], // バッファー:2
float buf[], // バッファー:格納先
int size1, // バッファーサイズ:1
int size2 // バッファーサイズ:2
){
「int sw,」は、「0:昇順、1:降順」と昇順/降順切り替え
「float buf1[],」は、1本目のソート済データ配列
「float buf2[],」は、2本目のソート済データ配列
「float buf[],」は、併合処理した結果のデータ配列
この関数は、配列が全て「float型」、単精度浮動小数型で
す!
「int size1,」は、1本目のソート対象一次元配列の
データ数!
「int size2」は、2本目のソート対象一次元配列のデータ
数!
(D)関数「SortMerge()」の【アルゴリズム】
){
int size; // バッファーサイズ
int i; // カウンタ:格納
int j; // カウンタ:1
int k; // カウンタ:2
size = size1 + size2; // 総サイズ算出
if( sw == 0 ){ // 昇順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] <= buf2[k] ){ // 「1」側が小なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が大なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
}else{ // 降順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] >= buf2[k] ){ // 「1」側が大なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が小なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
} //
}
(D-1)ローカル変数
){
int size; // バッファーサイズ
int i; // カウンタ:格納
int j; // カウンタ:1
int k; // カウンタ:2
「int size;」は、結果バッファーのサイズ
「int i;」は、結果配列の添え字&ループ用カウンタ
「int j;」は、1本目の配列の添え字
「int k;」は、2本目の配列の添え字
(D-2)アルゴリズムコード
size = size1 + size2; // 総サイズ算出
if( sw == 0 ){ // 昇順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] <= buf2[k] ){ // 「1」側が小なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が大なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
}else{ // 降順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] >= buf2[k] ){ // 「1」側が大なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が小なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
} //
}
★備考★ここまでの記述は、(4-14-109のD)と
同じです!更に言えば、この(4-14-111のD)の
アルゴリズムコードは、(4-14-109のD)と全く同
じです!今回は、(4-14-10109のDの日本語での
説明が私的に納得出来無いので別の説明アプローチをさせて
貰います!
★備考★アルゴリズムコードは、(4-14-109のD)
と全く同じですので(4-14-111のD)の説明を参考
にして下さい!ここでは、説明は省きます!
(4-14-113)関数「void SortMerge(int sw,
double buf1[],
double buf2[],double buf[],
int size1,int size2) {・・・}」
/************************************************************************/
/***** 併合ソート:データ=double *****/
/***** 「buf1」、「buf2」共「sw」で指定したソート済みが条件 *****/
/************************************************************************/
void CopyClear::SortMerge(
int sw, // 0:昇順、 1:降順
double buf1[], // バッファー:1
double buf2[], // バッファー:2
double buf[], // バッファー:格納先
int size1, // バッファーサイズ:1
int size2 // バッファーサイズ:2
){
int size; // バッファーサイズ
int i; // カウンタ:格納
int j; // カウンタ:1
int k; // カウンタ:2
size = size1 + size2; // 総サイズ算出
if( sw == 0 ){ // 昇順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] <= buf2[k] ){ // 「1」側が小なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が大なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
}else{ // 降順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] >= buf2[k] ){ // 「1」側が大なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が小なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
} //
}
☆備考☆この関数はファイル「CopyClear100」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
★注意★この関数には、同名で仮引数が異なるオーバーロー
ド(多重定義)関数が存在します!
(A)関数「SortMerge()」の【関数名】
「Sort」は、勿論、英単語「sort」、カタカナ語ソート・
ソーティング、詰り並び替えです、
「Merge」は、英語「merge」、「併合する、溶け合わせる」
です!ソーティングアルゴリズムとしては、マージソート≪
元々、古いコンピュータシステム(補助記憶装置が磁気テー
プ)で磁気テープのデータをマージする事で長大なソート済
みの2本の磁気テープから両方のデータを併合し一本のソー
ト済データを作成する事で考えられた、2本のソート済デー
タから1本の連続するソートデータを作成するソート方法≫
です!
(B)関数「void SortMerge()」の【返値】
返値を返さない関数です!
★注意★詰り、実引数の検査を実行時に行いませんので
使用する時は、正しい実引数を記載する必要が有ります!
(C)関数「SortMerge()」の【仮引数】
void CopyClear::SortMerge(
int sw, // 0:昇順、 1:降順
double buf1[], // バッファー:1
double buf2[], // バッファー:2
double buf[], // バッファー:格納先
int size1, // バッファーサイズ:1
int size2 // バッファーサイズ:2
){
「int sw,」は、「0:昇順、1:降順」と昇順/降順切り替え
「double buf1[],」は、1本目のソート済データ配列
「double buf2[],」は、2本目のソート済データ配列
「double buf[],」は、併合処理した結果のデータ配列
この関数は、配列が全て「double型」、倍精度浮動小数型で
す!
「int size1,」は、1本目のソート対象一次元配列の
データ数!
「int size2」は、2本目のソート対象一次元配列のデータ
数!
(D)関数「SortMerge()」の【アルゴリズム】
){
int size; // バッファーサイズ
int i; // カウンタ:格納
int j; // カウンタ:1
int k; // カウンタ:2
size = size1 + size2; // 総サイズ算出
if( sw == 0 ){ // 昇順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] <= buf2[k] ){ // 「1」側が小なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が大なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
}else{ // 降順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] >= buf2[k] ){ // 「1」側が大なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が小なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
} //
}
(D-1)ローカル変数
){
int size; // バッファーサイズ
int i; // カウンタ:格納
int j; // カウンタ:1
int k; // カウンタ:2
「int size;」は、結果バッファーのサイズ
「int i;」は、結果配列の添え字&ループ用カウンタ
「int j;」は、1本目の配列の添え字
「int k;」は、2本目の配列の添え字
(D-2)アルゴリズムコード
size = size1 + size2; // 総サイズ算出
if( sw == 0 ){ // 昇順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] <= buf2[k] ){ // 「1」側が小なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が大なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
}else{ // 降順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j] >= buf2[k] ){ // 「1」側が大なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が小なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
} //
}
★備考★ここまでの記述は、(4-14-109のD)と
同じです!更に言えば、この(4-14-111のD)の
アルゴリズムコードは、(4-14-109のD)と全く同
じです!今回は、(4-14-10109のDの日本語での
説明が私的に納得出来無いので別の説明アプローチをさせて
貰います!
★備考★アルゴリズムコードは、(4-14-109のD)
と全く同じですので(4-14-111のD)の説明を参考
にして下さい!ここでは、説明は省きます!
(4-14-114)関数「void SortMerge(int sw,
TypeCorr buf1[],
TypeCorr buf2[],TypeCorr buf[],
int size1,int size2) {・・・}」
/************************************************************************/
/***** 併合ソート:データ=TypeCorr *****/
/***** 「buf1」、「buf2」共「sw」で指定したソート済みが条件 *****/
/************************************************************************/
void CopyClear::SortMerge(
int sw, // 0:昇順、 1:降順
TypeCorr buf1[], // バッファー:1
TypeCorr buf2[], // バッファー:2
TypeCorr buf[], // バッファー:格納先
int size1, // バッファーサイズ:1
int size2 // バッファーサイズ:2
){
int size; // バッファーサイズ
int i; // カウンタ:格納
int j; // カウンタ:1
int k; // カウンタ:2
size = size1 + size2; // 総サイズ算出
if( sw == 0 ){ // 昇順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j].d <= buf2[k].d ){ // 「1」側が小なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が大なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
}else{ // 降順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j].d >= buf2[k].d ){ // 「1」側が大なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が小なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
} //
}
☆備考☆この関数はファイル「CopyClear100」に存在!
★注意★この関数は「public:」属性ですのでライブラリの
外から使用可能です!
★注意★この関数には、同名で仮引数が異なるオーバーロー
ド(多重定義)関数が存在します!
(A)関数「SortMerge()」の【関数名】
「Sort」は、勿論、英単語「sort」、カタカナ語ソート・
ソーティング、詰り並び替えです、
「Merge」は、英語「merge」、「併合する、溶け合わせる」
です!ソーティングアルゴリズムとしては、マージソート≪
元々、古いコンピュータシステム(補助記憶装置が磁気テー
プ)で磁気テープのデータをマージする事で長大なソート済
みの2本の磁気テープから両方のデータを併合し一本のソー
ト済データを作成する事で考えられた、2本のソート済デー
タから1本の連続するソートデータを作成するソート方法≫
です!
(B)関数「void SortMerge()」の【返値】
返値を返さない関数です!
★注意★詰り、実引数の検査を実行時に行いませんので
使用する時は、正しい実引数を記載する必要が有ります!
(C)関数「SortMerge()」の【仮引数】
void CopyClear::SortMerge(
int sw, // 0:昇順、 1:降順
TypeCorr buf1[], // バッファー:1
TypeCorr buf2[], // バッファー:2
TypeCorr buf[], // バッファー:格納先
int size1, // バッファーサイズ:1
int size2 // バッファーサイズ:2
){
「int sw,」は、「0:昇順、1:降順」と昇順/降順切り替え
「TypeCorr buf1[],」は、1本目のソート済データ配列
「TypeCorr buf2[],」は、2本目のソート済データ配列
「TypeCorr buf[],」は、併合処理した結果のデータ配列
この関数は、配列が全て「TypeCorr型」です!
「TypeCorr型」と「相関値+座標組型」≪解説『
解説クラスSupport』の中で「(2)構造体「struct
構文で定義」したデータ構造」の更に「(2-6)相関値+
座標」で説明?!≫のデータのソート対象一次元配列!
「int size1,」は、1本目のソート対象一次元配列の
データ数!
「int size2」は、2本目のソート対象一次元配列のデータ
数!
(D)関数「SortMerge()」の【アルゴリズム】
){
int size; // バッファーサイズ
int i; // カウンタ:格納
int j; // カウンタ:1
int k; // カウンタ:2
size = size1 + size2; // 総サイズ算出
if( sw == 0 ){ // 昇順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j].d <= buf2[k].d ){ // 「1」側が小なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が大なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
}else{ // 降順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j].d >= buf2[k].d ){ // 「1」側が大なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が小なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
} //
}
(D-1)ローカル変数
){
int size; // バッファーサイズ
int i; // カウンタ:格納
int j; // カウンタ:1
int k; // カウンタ:2
「int size;」は、結果バッファーのサイズ
「int i;」は、結果配列の添え字&ループ用カウンタ
「int j;」は、1本目の配列の添え字
「int k;」は、2本目の配列の添え字
(D-2)アルゴリズムコード
size = size1 + size2; // 総サイズ算出
if( sw == 0 ){ // 昇順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j].d <= buf2[k].d ){ // 「1」側が小なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が大なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
}else{ // 降順ソートの場合
for( i = 0, j = 0, k = 0; i < size; i++ ){ // 全体で
if( buf1[j].d >= buf2[k].d ){ // 「1」側が大なら
buf[i] = buf1[j]; // 「1」側を格納し
j++; // 「1」側カウントUP
if( j >= size1 ){ // 「1」側終了したら
for( i++; i < size; i++, k++ ){ // 「2」側を
buf[i] = buf2[k]; // 最後まで格納し
} //
return; // 終了
} //
}else{ // 「1」側が小なら
buf[i] = buf2[k]; // 「2」側を格納し
k++; // 「2」側カウントUP
if( k >= size2 ){ // 「2」側終了したら
for( i++; i < size; i++, j++ ){ // 「1」側を
buf[i] = buf1[j]; // 最後まで格納し
} //
return; // 終了
} //
} //
} //
} //
}
★備考★ここまでの記述は、(4-14-109のD)と
同じです!更に言えば、この(4-14-111のD)の
アルゴリズムコードは、(4-14-109のD)と全く同
じです!今回は、(4-14-10109のDの日本語での
説明が私的に納得出来無いので別の説明アプローチをさせて
貰います!
★備考★アルゴリズムコードは、(4-14-109のD)
と全く同じですので(4-14-111のD)の説明を参考
にして下さい!ここでは、説明は省きます!
ここでは、差分だけ説明します!
差分は、(4-14-108)から(4-14-112)
まででは、「「if(buf1[j]<=buf2[k])」等の
配列1と配列2のデータの大小比較している所が、
ここでは、「「if(buf1[j].d<=buf2[k].d)」等と、
「TypeCorr型」の相関値を比較するメンバー変数「.d」に
対して比較している事が違う所です!
本日(1月25)の講義はココまでとします!
流石に新しくと言うか大量の解説なので受講者の皆様が、
消化出来る為にココまでとします!
次から、【マルチ・ソーティング】系の関数の解説に成るので
新しく新規解説『解説クラスCopyClear(21)』
として近々、始めますので宜しく、御贔屓の程、お願いしま
す!