Gnomesort仅适用于前两个字符串

时间:2018-09-29 12:37:44

标签: java algorithm sorting

我需要实现一个gnomesort来对字符串与字符串输入的接近程度进行排序。我用Levenshtein算法来衡量这种差异。

算法工作正常,但前提是我在数据库中有两个字符串。然后对它进行很好的排序,但是如果有两个以上的字符串,它只会按照它们在数据库中的顺序打印它们。我真的找不到问题

public static void retrieveFromDatabase(String string) 
{        
    String[] sq = new String[database.size()];
    database.toArray(sq);        
    int r = 0, index = 1, y = 2, tmp1 = 0;
    String tmp2;

    int[] ds = new int[sq.length];

    for (int i = 0; i < database.size(); i++) {
        ds[i] = sortLevenshtein(string, database.get(i), false);
    }

    for(index = 1; index < ds.length; index++) // gnomsort
    {
        if(ds[index - 1] <= ds[index] )
        {
            ++index;
        }
        else
        {
            tmp1 = ds[index];
            tmp2 = sq[index];
            ds[index] = ds[index - 1];
            sq[index] = sq[index - 1];
            ds[index-1] = tmp1;
            sq[index-1] = tmp2;
            index--;
            if (index == 0) 
                index++;
        }
    }
    System.out.println("Best matches: ");
        for(r=0; r<Math.min(3,sq.length); r++)
        {
            System.out.println(ds[r] + "\t" + sq[r]);
        } 
}

The problem

1 个答案:

答案 0 :(得分:0)

要排序的元素超过两个时,您的gnome排序不正确。

在有问题的情况下,您的ds从一开始就包含1、1、0。在for循环中,index为1。您看到索引0和1处的元素的顺序正确(两个元素均为1),因此在index中将if递增到2 for语句。接下来,您的index循环也会递增ds.length,因此现在是3。3不小于for(也是3),因此循环终止。

我不知道gnome的排序,因此无法告诉您解决方法。我能告诉您的是,在index循环内操作for循环控制变量— for(index = 1; index < ds.length; index++) // OK: loop control variable is incremented here { if(ds[index - 1] <= ds[index] ) { ++index; // No-no: incrementing loop control variable, dangerous } else { tmp1 = ds[index]; tmp2 = sq[index]; ds[index] = ds[index - 1]; sq[index] = sq[index - 1]; ds[index-1] = tmp1; sq[index-1] = tmp2; index--; // No-no: decrementing loop control variable, problematic if (index == 0) index++; // No-no: incrementing loop control variable } } 是在代码中 public class Message { private System.Drawing.Image image; private string stringMember; private string nullMember; public Message(System.Drawing.Image i, string str1, string str2) { image = i; stringMember = str1; nullMember = str2; } public System.Drawing.Image MonImage { get { return image; } } public string StringMember { get { return stringMember; } } public string NullMember { get { return nullMember; } } } 的肯定方式,这种方式很难理解而且很难发现错误。我从来没有这样做。

 System.Drawing.Image myImage = WpfApp3.Properties.Resources.stan;
        List<Message> items = new List<Message>();
        items.Add(new Message(myImage, "Test", null));
        DataGrid.ItemsSource = items;