有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么这种插入排序不起作用?

我创建了一个定义电影对象的电影类。这是测试该类的客户机类。我创建了一个方法,可以按创建年份对电影对象数组进行排序。当我测试这个程序时,我发现有些电影对象会被排序,有些则不会。有人能帮我解释一下为什么这不管用吗

public class MovieTesterv2 {
public static void main(String[] args) {
    Movie[] movies = {new Movie("Meet the Robinsons", 2007, "Disney"),
            new Movie("Avengers: Infinity War", 2018, "Pinewood"),
            new Movie("Iron Man", 2008, "Tim Miller"),
            new Movie("Aquaman", 2018, "Hollywood"),
            new Movie("Bumblebee", 2018, "Hollywood"),
            new Movie("Transformers", 2007, "Universal"),
            new Movie("The Lion King", 1994, "Disney"),
            new Movie("Mummy", 1999, "Universal"),
            new Movie("Minions", 2015, "Universal"),
            new Movie("Cinderella", 1950, "Disney")};
    insertionYear(movies);
}

public static void printMovies(Movie[] movies) {
    System.out.println("                 Movie     Year       Studio");
    System.out.println("--------------------------------------------");
    for (Movie movie: movies) {
        if (movie != null) {
            System.out.printf("%22s%9s%13s%n", movie.getTitle(),
                    movie.getYear(), movie.getStudio());
        }
    }
}

public static void insertionYear(Movie[] movies) {
    Movie[] sorted = new Movie[movies.length];

    for (int i = 0; i < movies.length; i++) {
        int k = i;
        while (k > 0) {
            if (movies[i].getYear() <= movies[k - 1].getYear()) {
                sorted[k] = sorted[k - 1];
                k--;
            } else {
                break;
            }
        }
        sorted[k] = movies[i];
        printMovies(sorted);
        System.out.println();
    }

    for (int i = 0; i < movies.length; i++) {
        movies[i] = sorted[i];
    }
}

}

这是电影课

public class Movie
{
    private int year;
    private String title;
    private String studio;

    public Movie(String title, int year, String studio)
    {
        this.title = title;
        this.year = year;
        this.studio = studio;
    }

public String getTitle()
{
    return title;
}

public void setTitle(String title)
{
    this.title = title;
}

public String getStudio()
{
    return studio;
}

public void setStudio(String studio)
{
    this.studio = studio;
}

public int getYear()
{
    return year;
}

public void setYear(int year)
{
    this.year = year;
}

public String toString()
{
    String str = String.format("%-30s %4d   %-20s", title, year, studio);
    return str;
}

}


共 (2) 个答案

  1. # 1 楼答案

    看这一行:

    if (movies[i].getYear() <= movies[k - 1].getYear()) {
    

    您希望将电影与已排序的列表进行比较,而不是与自己的电影列表进行比较

  2. # 2 楼答案

    不像插入排序通常那样,将每个元素与排序列表进行比较。在这方面

    if (movies[i].getYear() <= movies[k - 1].getYear())
    

    将当前正在迭代的电影与原始列表中之前的电影进行比较。这应该改为

    if (movies[i].getYear() <= sorted[k - 1].getYear())
    

    原因是,现在您正在将索引i处的当前电影与排序数组中索引小于i的电影进行比较。通过这种方式,你可以在迄今为止分类的电影中找到当前电影的正确位置