当前位置: 首页 > 知识库问答 >
问题:

Java:数组大小的插入排序问题

郑卜鹰
2023-03-14

我试图编写一个排序程序,询问用户使用哪种排序方法(插入、冒泡、选择),然后让用户输入整数进行排序。

我认为除了数组之外,我的一切都是正确的:我希望数组的大小与用户输入的整数一样大,但我似乎做得不对。

在insertionSort方法所在的排序类中,我应该将输入参数命名为那样的名称(通过整个算法),还是应该使用“arr”这样的通用名称?

在哪里可以改进和更正代码?

感谢任何帮助!!

DriverSort类别:

import java.util.Scanner;

public class DriverSort 
{
    public static void main(String[] args) 
    {
        Scanner scan =new Scanner(System.in);
        Sorter sorter = new Sorter();

        int choice;// variable which says which sorting algorithm to use

        System.out.println("1-Insertion sort\n"
                    +"2-Selection sort\n"
                    + "3-Bubble sort\n"
                    + "0-quit\n");
        int size = scan.nextInt();
        int input[] = new int[size];

        System.out.println("Please enter the number for a sorting method or enter 0 to quit: ");
        size = scan.nextInt();


        System.out.println("\nBefore Sorting: ");
        sorter.printArray(input);

        // sort the array
        Sorter.insertionSort(input);
        System.out.println("\nAfter Sorting: ");
        sorter.printArray(input);

        switch (choice) 
        {
            case 0:
                System.out.println("Goodbye!");
                System.exit(0);
                break;

            case 1: 
                Sorter.insertionSort(input);
                sorter.printArray(input);
                break;
        }
   }
}

排序类:

public class Sorter
{
    public static int[] insertionSort(int[] input) 
    {
        for (int i = 1; i < input.length; i++) 
        {
            int valueToSort = input[i];
            int j = i;

            while (j > 0 && input[j - 1] > valueToSort) 
            {
                input[j] = input[j - 1];
                j--;
            }//end while loop.

            // insert the element
            input[j] = valueToSort;
        }//end for loop    

        return input;
    }//end insertionSort          

    public void printArray(int[] input) 
    { 
        System.out.println(input.toString());
    }
}   

共有2个答案

宦书
2023-03-14

我首先看到的是

int size = input.length;
int input[] = new int[size];

这太违法了,我停止了阅读。要么硬编码尺寸,要么提示用户输入。

int size = 10; // <-- 10
int input[] = new int[size]; // <-- this is fine.

int input[] = new int[10]; // <-- 10
int size = input.length; // <-- this if also fine.

那么,你想要什么-

System.out.println("Please enter the number for a sorting "
    + "method or enter 0 to quit: ");
int choice = scan.nextInt();
System.out.println("How many numbers do you want to enter: ");
int size = scan.nextInt();
int input[] = new int[size];
马嘉勋
2023-03-14

我建议完全删除Sorter类,并将Sorter类的功能作为方法添加到DriverSorter中。我这么说是因为您实现Sorter的方式不会创建有用的实例。

import java.util.Scanner;

public class DriverSort {

    public static void main(String[] args) {

        Scanner scan =new Scanner(System.in);

        // this makes more sense to put this at the start of the program
        int choice;  // variable which says which sorting algorithm to use
        System.out.println("1-Insertion sort\n"
                +"2-Selection sort\n"
                + "3-Bubble sort\n"
                + "0-quit\n");
        choice = scan.nextInt();

        if (choice != 0) { // a simple if else statement will do just fine
            // must prompt user for the "input first"
            System.out.println("Enter the length vector to be modified: ");
            int size = scan.nextInt();
            // now actually get the vector
            int input[] = new int[size];
            for (int i = 0; i < size; i++) {
                System.out.println("Enter next array element: ");
                input[i] = scan.nextInt();
            }

            System.out.println("\nBefore Sorting: ");
            System.out.println(input); // use the builtin functionality
            // sort the array
            int[] output = insertionSort(input);
            System.out.println("\nAfter Sorting: ");
            System.out.println(output);
        } else { 
            System.out.println("Goodbye!");
            System.exit(0);
        }  
    }

    // returns a sorted list (add more detail here)
    // add a new input that tells what sort of sorting to do
    public static int[] insertionSort(int[] input) {

        for (int i = 1; i < input.length; i++) {
            int valueToSort = input[i];
            int j = i;
            while (j > 0 && input[j - 1] > valueToSort) {
                input[j] = input[j - 1];
                j--;
            }//end while loop.
            // insert the element
            input[j] = valueToSort;
        }//end for loop    
        return input;
    } 
}

保持分拣类:

public class Sorter {
    private int vector; \\ private just means only things inside this class can affect this variable
    // now initializer 
    public Sorter(int[] input) {
        this.vector = input; \\ set our field to be equal to the vector you input when making an instance
    // so the call to make a Sorter object will now be "Sorter sorter = new Sorter(input);"
    }

    // make this act on vector instead
    public static int[] insertionSort() // no input because it can "see" our vector field
    {
        int[] copy = this.vector; // make a copy so you don't mess vector up before your finished
        for (int i = 1; i < copy.length; i++) 
        {
            int valueToSort = copy[i];
             int j = i;

            while (j > 0 && copy[j - 1] > valueToSort) 
            {
                copy[j] = copy[j - 1];
                j--;
            }//end while loop.

            // insert the element
            copy[j] = valueToSort;
        }//end for loop    

        this.vector = copy; // now replace old field with our sorted copy!
    }//end insertionSort          

    // this is an excellent way to be able to see "vector" without allowing other
    // mischievous programs to accidentally change "vector." This is very similar reasoning
    // to why you very frequently have fields be private. Read up on encapsulation - it's 
    // super useful.
    public void printArray(int[] input) 
    { 
    System.out.println(this.vector.toString());
    }

}

 类似资料:
  • 我试图构造一个最大堆,当插入每个新值时,值会上移或下移到正确的位置,我还没有实现下移函数,所以现在我正在使用一个测试,该测试应该只需要程序上移。测试数据按以下顺序输入: [16, 10, 14, 9, 7, 1, 4, 2, 8, 3] 我在主类中使用以下代码在堆中插入值: 下一位代码是插入和移位的地方: 移位函数是siftUp(),我认为这就是问题所在。当程序以这些输出运行时: 但这是不正确的,

  • 我有下面的代码,我在一个整数排序的LinkedList中插入了一个新的整数,但我不认为这是“正确”的方法,因为我知道,有指向下一个值的单LinkedList和指向下一个和上一个值的双LinkedList。我试图使用节点来实现以下情况,但Java正在导入这个导入组织。w3c。多姆。节点(文档对象模型)因此卡住了。 插入盒 > }

  • 我正在尝试自己编程气泡排序、选择排序和插入排序。但是,我在插入排序方面遇到了麻烦。我会提供我的代码以及每行在做什么 好的,所以int count是找出排序数组的起始位置。然后我声明了index以查找将元素放在排序数组之后的位置,并为未排序数组的第一个元素声明了一个临时int,如果它小于排序数组的最后一个元素。然后它反转数组直到第一个元素,如果它大于我要添加的元素,则为其索引分配索引。本质上是为了让

  • 我正试图按排序的顺序将一个元素添加到数组中。 5、6、7、9、11、0

  • 本文向大家介绍Java程序以区分大小写的顺序对数组进行排序,包括了Java程序以区分大小写的顺序对数组进行排序的使用技巧和注意事项,需要的朋友参考一下 可以使用java.util.Arrays.sort()方法以区分大小写的顺序对数组进行排序。在这种情况下,此方法仅需要单个参数,即要排序的数组。演示此的程序如下所示- 示例 输出结果 现在让我们了解上面的程序。 首先定义数组arr []。然后打印未

  • 本文向大家介绍java数据结构之插入排序,包括了java数据结构之插入排序的使用技巧和注意事项,需要的朋友参考一下 插入排序就是把当前待排序的元素插入到一个已经排好序的列表里面。 一个非常形象的例子就是右手抓取一张扑克牌,并把它插入左手拿着的排好序的扑克里面。          插入排序的最坏运行时间是O(n2), 所以并不是最优的排序算法。          如果输入数组已经是排好序的话,插入排