Java 插入排序与Shell排序程序。Shell排序只在某些时候起作用

Java 插入排序与Shell排序程序。Shell排序只在某些时候起作用,java,sorting,insertion-sort,shellsort,Java,Sorting,Insertion Sort,Shellsort,这是一个数据结构类。任务是编写一个程序,从txt文件中获取100个整数的列表,取两组不同的4个间隔进行shell排序,然后对100个数字进行排序,1)按插入排序,2)按shell排序,以前4个数字为间隔,3)按第二个100为间隔进行shell排序,将排序后的列表输出到txt文件,打印每个排序中发生的分配操作的数量(尚未完成此部分) 当我编译和运行一个shell排序时,它通常不能完全工作,尽管它已经部分排序。不完全排序的shell排序可以是任意一种排序,因此我假设程序以一定的间隔工作,但不以其他间

这是一个数据结构类。任务是编写一个程序,从txt文件中获取100个整数的列表,取两组不同的4个间隔进行shell排序,然后对100个数字进行排序,1)按插入排序,2)按shell排序,以前4个数字为间隔,3)按第二个100为间隔进行shell排序,将排序后的列表输出到txt文件,打印每个排序中发生的分配操作的数量(尚未完成此部分)

当我编译和运行一个shell排序时,它通常不能完全工作,尽管它已经部分排序。不完全排序的shell排序可以是任意一种排序,因此我假设程序以一定的间隔工作,但不以其他间隔工作,这是不好的:)。有人能帮忙吗

/**
 * @(#)Savit5.java
 *
 * Savit5 application
 *
 * @author
 * @version 1.00 2011/12/8
 */
 import java.util.*;
 import java.lang.*;
 import java.io.*;

public class Savit5 {

public static void main(String[] args) {

try {
    Scanner keyboardScanner = new Scanner(System.in);
    System.out.println("Please input the input file location:");
    String filePath = keyboardScanner.nextLine();
    Scanner scanner = new Scanner(new File(filePath));
    System.out.println("Please input 4 increment values for the first Shell Sort:");
    String shellOne = keyboardScanner.nextLine();
    System.out.println("Please input 4 increment values for the Second Shell Sort:");
    String shellTwo = keyboardScanner.nextLine();
    Scanner scanOne = new Scanner(shellOne);
    Scanner scanTwo = new Scanner(shellTwo);
    System.out.println("Please input the output file location:");
    String out = keyboardScanner.nextLine();
    int[] inc1 = new int[4];
        int q = 0;
        while (scanOne.hasNextInt()){
            inc1[q++] = scanOne.nextInt();
        }

    int[] inc2 = new int[4];
        int r = 0;
        while (scanTwo.hasNextInt()){
            inc2[r++] = scanTwo.nextInt();
        }

        int [] anArray = new int [100];
        int z = 0;
            while(scanner.hasNextInt()){
                anArray[z++] = scanner.nextInt();
            }
    int[] anArray2 = (int[])anArray.clone();
    int[] anArray3 = (int[])anArray.clone();
    int[] count = {0, 0, 0};
    int cnt=0;

    insertionSort(anArray, count, cnt);
    System.out.println("Assignment count:" + count[cnt]);
    cnt=1;
    shellSort(anArray2, inc1, count, cnt);
    System.out.println("Assignment count:" + count[cnt]);

    FileWriter output = new FileWriter(out);
    PrintWriter out2 = new PrintWriter(output);
    out2.println("Insertion Sort:");

    for (int i =0; i<anArray.length; i++) {
        out2.println(anArray[i]);
    }


    out2.println("Shell Sort 1:");
    for (int i =0; i<anArray2.length; i++) {
        out2.println(anArray2[i]);
    }

    out2.println("Shell Sort 2:");
    for (int i =0; i<anArray3.length; i++) {
        out2.println(anArray3[i]);
    }
    out2.close();
}
catch (IOException e)
{
    System.out.println (e);
}
}

public static void insertionSort(int[] a, int[] count, int cnt) {
    for (int i=1, j; i < a.length; i++) {
        int tmp = a[i];
        count[cnt] += 1;
        for (j = i - 1; j >= 0; j--) {
            if (a[j] <= tmp) break;
            a[j + 1] = a[j];
            count[cnt] += 1;
        }
        a[j + 1] = tmp;
        count[cnt] += 1;
    }
}


public static void shellSort(int[] a, int[] inc, int[] count, int cnt) {
for (int k =0; k<inc.length; k++) {
for (int i= inc[k], j; i < a.length; i+=inc[k]) {
    int tmp = a[i];
    count[cnt] +=1;
    for (j = i - inc[k]; j >= 0; j -= inc[k]) {
        if (a[j] <= tmp) break;
        a[j + inc[k]] = a[j];
        count[cnt] +=1;
    }
    a[j + inc[k]] = tmp;
    count[cnt] +=1;
   }
}
}


}
/**
*@(#)Savit5.java
*
*Savit5应用程序
*
*@作者
*@version 1.00 2011/12/8
*/
导入java.util.*;
导入java.lang.*;
导入java.io.*;
公共类Savit5{
公共静态void main(字符串[]args){
试一试{
扫描仪键盘扫描仪=新扫描仪(System.in);
System.out.println(“请输入输入文件位置:”);
String filePath=keyboardScanner.nextLine();
Scanner Scanner=新扫描仪(新文件(文件路径));
System.out.println(“请为第一个Shell排序输入4个增量值:”;
String shellOne=keyboardScanner.nextLine();
System.out.println(“请为第二个Shell排序输入4个增量值:”;
String shellTwo=keyboardScanner.nextLine();
扫描仪scanOne=新扫描仪(shellOne);
扫描器scanTwo=新扫描器(shellTwo);
System.out.println(“请输入输出文件位置:”);
String out=keyboardScanner.nextLine();
int[]inc1=新的int[4];
int q=0;
while(scanne.hasNextInt()){
inc1[q++]=scanne.nextInt();
}
int[]inc2=新的int[4];
int r=0;
while(scanTwo.hasNextInt()){
inc2[r++]=scanTwo.nextInt();
}
int[]anArray=新int[100];
int z=0;
while(scanner.hasNextInt()){
anArray[z++]=scanner.nextInt();
}
int[]anArray2=(int[])anArray.clone();
int[]anArray3=(int[])anArray.clone();
int[]计数={0,0,0};
int-cnt=0;
插入排序(数组、计数、cnt);
System.out.println(“分配计数:“+count[cnt]);
cnt=1;
外壳分类(anArray2,inc1,count,cnt);
System.out.println(“分配计数:“+count[cnt]);
FileWriter输出=新的FileWriter(输出);
PrintWriter out2=新的PrintWriter(输出);
out2.println(“插入排序:”);

对于(int i=0;i我认为问题在于“inc”(如inc1)向量可能并不总是以1结尾。这一步是算法所要求的,因为最后一次迭代应该类似于正常的插入排序(但更快,因为几个元素已经排序)


如果是这种情况,您可以在代码中添加一个附加检查。如果不是,请提供一个示例。

我认为问题在于“inc”(如inc1)向量可能并不总是以1结尾。这一步是算法所要求的,因为最后一次迭代应该类似于正常的插入排序(但要快得多,因为有几个元素已经被排序了)


如果是这种情况,您可以在代码中添加一个附加检查。如果不是,请提供一个示例。

我忘了提到“inc”数组总是以一结尾。问题似乎总是发生在对shellSort的第二次调用上。是否可能我没有重置干扰第二次调用的值?我只看到对shellSort的一次调用。可能您只是忘记了添加对shellSort的调用?:-)如果你能给我举个例子就容易多了。@ReezaCoriza如果你有答案,你可能会认为它是正确的。我忘了提到“inc”数组总是以一结尾。问题似乎总是发生在对shellSort的第二次调用上。是否可能我没有重置干扰第二次调用的值?我只看到对shellSort的一次调用。可能您只是忘记了添加对shellSort的调用?:-)如果你能给我举个例子,那就容易多了。@ReezaCoriza如果你有答案,你可能会认为它是正确的。