3

C#での配列の並べ替えに関するタスクがいくつかあります。私は考えられるすべてのことを試みてきました-運がありません。

タスクは、既知の並べ替えアルゴリズム(挿入、選択、バブル、クイック)によって整数の配列を並べ替えることです。つまり、最小の要素のみを並べ替える必要があります。M

例:7つの要素の配列があり2 9 8 3 4 15 11、配列がになるように最小の3つの要素を並べ替える必要があります2 3 4 9 8 15 11

助けてください、私はここSOでも、Googleのどこでも何も見つけられないようです。私は私のためにすべてのアルゴリズムを実行するように求めているわけではありません。それがどのように可能であるかを把握するために、そのうちの1つが必要です。

E:考えてくれてありがとう。私はあなたのすべての推奨事項を確認し、次のような挿入ソートを作成することを達成しました。

static int[] insertSort(int[] arr, out int swaps, out int checks) {
    int step = 0;
    swaps = 0;
    checks = 0;
    for (int i = 0; i < arr.Length; i++) {
        int min = arr[i], minind = i;
        for (int j = i + 1; j < arr.Length; j++) {
            checks++;
            if (arr[j] < min) {
                min = arr[j];
                minind = j;
            }
        }
        int temp = arr[minind];
        if (step < M) {
            for (int j = minind; j > i; j--) {
                swaps++;
                arr[j] = arr[j - 1];
            }
            arr[i] = temp;
            swaps++;
            step++;
        }
    }
    return arr;
}

スワップとチェック-私のアプリケーションの要件。

PS私は、SOが誰かのために宿題をするのが好きではないことを何度も見てきました。だから私はコードを求めていません。それを達成する方法についての考えを求めただけです。

ここで私を助けてくれた人たちにもう一度感謝します。

4

7 に答える 7

3

あなたの実装を見ずに、これは答えるのが難しいです。これを行うには多くの方法があり、ほとんどは簡単です。

ただし、いくつかのアイデアがあります。

  1. 並べ替える数値のみを保持する「一時的な」配列を作成し、並べ替えてから、元の配列に置き換えます(おそらく最適ではないソリューション)
  2. 必要な回数(3回など)を繰り返すforループを使用します。これはおそらく最良の解決策です
  3. ここにあなたのコードをSOに投稿してください。そうすれば、何人かの素朴な人がおそらくあなたに解決策を与えるので、あなたは自分で学業をする必要はありません。(これは怠惰でありえない解決策です)
于 2012-11-26T15:53:11.240 に答える
3

効率の制限がないため:

  1. iを0に設定します。
  2. ソートされていない要素の中から最小値を探します。
  3. 位置iに挿入し、配列をシフトします。
  4. インクリメントi。
  5. M回繰り返します。

複雑さはO(N * M)です。

于 2012-11-26T15:55:57.337 に答える
1

これがあなたが探しているものだと思います。これは、特定のインデックスに基づいて昇順で配列を並べ替える例です。

        int startIndex=2;
        int endIndex=5;
        int[] elements=new int[7];
        elements[0]=2; 
        elements[1]=9;
        elements[2]=8;
        elements[3]=3;
        elements[4]=4;
        elements[5]=15;
        elements[6]=11;
        for (int a=startIndex-1;a<endIndex;a++){
            for(int b=startIndex-1;b<endIndex;b++){
                if (elements[a]<elements[b]){
                    int temp =elements[a];
                    elements[a]=elements[b];
                    elements[b]=temp;
                }
            }
        }
        for (int c=0;c<elements.Length;c++){
            Console.Write(elements[c]+",");
        }

説明を並べ替える場合は、「<」を「>」に変更するだけです。

于 2012-11-26T16:16:13.210 に答える
0

使用する必要のある並べ替えアルゴリズムを確認する必要があります。たとえば、forループを使用するものを使用しているとします。ほとんどの場合、このようなものが表示されます

for(int i = 0; i <arrayName.length(); i ++){}

あなたの場合、forループのパラメータを変更するだけです

for(int i = 0; i <M; i ++){}

ここで、MはarrayName.length();よりも小さいです。とは、最初から並べ替えたい位置の数です。

アレイの残りの部分は、そのままで、同じままである必要があります。

于 2012-11-26T15:54:11.730 に答える
0

カップルのもの。ほとんどの並べ替えアルゴリズムは、最大範囲としてarray.lengthを使用します。代わりにmを使用できますか?すなわち

for (int i = 0; i < m; i++)

また、最初のm文字の一時配列を使用して並べ替えてから、再割り当てすることもできます。

int[] temp; 
for (int i = 0; i < m; i++)
{
    temp[i] = realArray[i]; 
}
//sort, then
for (int i = 0; i < m; i++)
{
    realArray[i] = temp[i]; 
}
于 2012-11-26T15:57:36.043 に答える
0

配列全体を並べ替えて、別の配列に配置します。

最小のx要素のみを保持するように、新しい配列を切り捨てます。その配列から最大数を取得します(この例では4)。

初期配列をループして、それよりも大きい数値をすべて追加します。


入力:2 9 8 3 4 15 11
すべて並べ替え:2 3 4 8 9 11 15
切り捨て:2 3 4

この配列から最大値を取得します(4)
元の配列をループして追加します

2は4よりも高いですか?いいえ
9は4よりも高いですか?はい、追加します(現在:2 3 4 9)
8は4よりも高いですか?はい、追加します(現在、2 3 4 9 8があります)
3は4よりも高いですか?いいえ
4は4よりも高いですか?いいえ
15は4よりも高いですか?はい、追加します(現在:2 3 4 9 8 15)
11は4よりも高いですか?はい、追加します(現在:2 3 4 9 8 11)

*これは最も効率的な方法ではなく、番号が重複している場合は問題が発生する可能性があります

于 2012-11-26T16:27:07.610 に答える
-2

LINQの使用に関する処方箋はありますか?

int a[] = new int[] {2, 9, 8, 3, 4, 15, 11}; 
const int M = 5;
a = a.Take(M).OrderBy(e => e).ToArray(); // EDIT: Added .ToArray()
于 2012-11-26T16:02:21.500 に答える