、我々はCでマージソート関数を記述するために、次のとおりです。マージソート(N * [N]をログ)ランタイム
sort(int* array, unsigned len);
私は、コードが書かれており、作業を持っていますが、そのランタイムはO(N^2*log[N])
であり、これはマージソートの目的を無効にします。次のように合流部があるため、非効率理由は:
ct1
左リストするためのカウンタである
while(ct1 < len1 && ct2 < len2){
if(array[0] < array[len1 - ct1]){
ct1++;
array++; // no longer look at that element
}
else{
int position = len1 - ct1;
int hold = array[position];
while(position > 0){
array[position] = array[position - 1];
position--;
}
array[0] = hold;
ct2++;
array++;
}
}
をct2
は、右側のリストのためのカウンタであり、アレイは、アレイへのポインタです。 ct1
とct2
の両方が最初にゼロに設定されます。私が言ったように、これは機能します、あなたはすべてをシフトしなければならないので、それはただ効率的ではありません。並べ替える前にサブ配列を2つの一時配列に分割したいのですが、長さが定数として定義されていない配列は作成できません。ヘルパー関数を使うことはできますが、関数のパラメータを変更することはできません。配列へのポインタと長さが必要です。
この種の処理を行うために「スクラッチ」スペースとして使用するには、元の配列のサイズ以下のメモリを割り当てる必要があります。動的メモリ割り当てを使用することは許可されていますか? –
動的に配列を作成できます。たとえば、int * tmp =(int *)malloc(i * sizeof(int))です。 – sarvesh
mallocの戻り値に間違ったキャストを取り除くモジュロ... –