Java 插入排序与Shell排序程序。Shell排序只在某些时候起作用
这是一个数据结构类。任务是编写一个程序,从txt文件中获取100个整数的列表,取两组不同的4个间隔进行shell排序,然后对100个数字进行排序,1)按插入排序,2)按shell排序,以前4个数字为间隔,3)按第二个100为间隔进行shell排序,将排序后的列表输出到txt文件,打印每个排序中发生的分配操作的数量(尚未完成此部分) 当我编译和运行一个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排序可以是任意一种排序,因此我假设程序以一定的间隔工作,但不以其他间
/**
* @(#)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如果你有答案,你可能会认为它是正确的。