1

二次元配列の選択ソートのアルゴリズムは何ですか? どこでも 2D 配列について調べて読みましたが、シンプルで直接的なものは何も見つからないため、フォーラムで質問することにしました。(1D 配列の並べ替えを変更して 2D 配列にする方法が頭に浮かびません!!)

たとえば、次のようになります。

name ----- crime ----- year

name1 ---- arson ----- 1996
name2 ---- theft ----- 2003
name3 ---- arson ----- 1976
name4 ---- theft ----- 2010

これになります:

name ----- crime ----- year

name1 ---- arson ----- 1996
name3 ---- arson ----- 1976
name2 ---- theft ----- 2003
name4 ---- theft ----- 2010

どんな助けでも素晴らしいでしょう!ありがとう!

編集

選択ソート用のコードは次のとおりです。それらのほとんどは適切に編成されていますが、数行で、それが属していない「放火」があり、それがなぜなのかわかりません. これが私のコードです:

for(i = 0; i < 10; i++){
        smallest = i;
        for(j = i; j < 10; j++){
            if(criminals[i][1].compareTo(criminals[j][1]) > 0){
                smallest = j;
            }
        }
        temp = criminals[i][1];
        criminals[i][1] = criminals[smallest][1];
        criminals[smallest][1] = temp;
    }

    //output
    for(i = 0; i < 10; i++){
        System.out.println(criminals[i][0] + " - " + criminals[i][1] + " - " + criminals [i][2]);
    }

そして、これは私の入力と出力です:

Not sorted list:
Al Capone - arson - 2009
Slippery Sal - theft - 2001
Nada - arson - 1987
Slippery Sal - theft - 1999
Salma - assault - 2010
Scooby Doo - theft - 1998
Velma - assault - 1991
Daphne - arson - 1976
Fred - assault - 2003
Shaggy - arson - 2007
Sorted list (by crime):
Al Capone - arson - 2009
Slippery Sal - arson - 2001
Nada - arson - 1987
Slippery Sal - assault - 1999
Salma - arson - 2010
Scooby Doo - assault - 1998
Velma - assault - 1991
Daphne - theft - 1976
Fred - theft - 2003
Shaggy - theft - 2007
4

4 に答える 4

3

あなたの犯罪行為のために、これをしてください:

static final int SORT_BY_NAME = 0;
static final int SORT_BY_CRIME = 1;
static final int SORT_BY_YEAR = 2;

これを仮定すると:

Object[10][3] = {{"Name", "CRIME", "YEAR"},...};

次に、並べ替えアルゴリズムに進みます。

void SelSort(Objects[][] criminals, int sortBy) 
{
    if (criminals == NULL || criminals.length == 0 || sortBy >= criminals[0].length || sortBy < 0)
        return;

    int i,j;
    Object min;

    for (i=0; i < criminals.length ; i++) {
       min = criminals[i][sortBy];
        for (j = i+1; j < criminals.length; j++){
            if (((criminals[j][sortBy].getClass()).cast(min)).compareTo(criminals[j][sortBy]) == 1){//Assuming you can compare them this way else make a method to compare
                Object tmp = criminals[j];
                criminals[j] = criminals[i];
                criminals[i] = tmp;
            }
        }
    }             

}
于 2013-09-20T02:11:24.217 に答える
1

まず第一に、うるさいことに、次のようなCriminalオブジェクトの配列があるように見えます

class Criminal {
    private String name;
    private String crime;
    private int year;
    .
    .
    .
}

次に、犯罪オブジェクトの 1D 配列が得られます。通常の選択ソートアルゴリズムを使用できますが、比較する代わりに

criminals[i] < criminals[j]

あなたは比較するだろう

criminals[i].getCrime() < criminals[j].getCrime()

ここで、うるさいのではなく、文字列の 2 次元配列が実際にあると仮定して、配列の各行自体が文字列の配列であることを前提とします。次に、選択ソートを実行しますが、次のように比較します。

criminals[i][1] < criminals[j][1]

これは次の理由で機能します。

criminals[row][0]   is the name
criminals[row][1]   is the crime
criminals[row][2]   is the year

スワップを行うと、行全体がスワップされ、必要なものが得られます。

于 2013-09-20T02:15:18.887 に答える
0

したがって、2D 配列はString[][] arrayです。次に、配列を初期化し、次のことを行います

for (int i = 0; i < array.length; i++)
{
    int index = i;
    for (int j = i + 1; j < array.length; j++)
    {
        if (array[j][sortByColIndex].compareTo(array[index][sortByColIndex]) < 0)
        {
            index = j;
        }
    }
    String smallerNumber = scores[index][sortByColIndex];
    scores[index][sortByColIndex] = scores[i][sortByColIndex];
    scores[i][sortByColIndex] = smallerNumber;

    // Displaying sorted value
    System.out.print(array[i][0] + "\t" + array[i][1] + "\t" + array[i][2] + "\t");

}
于 2015-03-11T07:59:01.137 に答える
0

あなたのコメントから、指定された全体的な並べ替え基準は次のとおりです。各行内で、要素を並べ替える必要があります。

一度に各 1D 配列 (2D 配列の) で選択並べ替えアルゴリズムを実行します。

于 2013-09-20T02:01:07.300 に答える