2011-12-09 12 views
1

これはデータ構造体クラスのためのものです。割り当ては、txtファイルから100個の整数のリストを取って、シェルソートのための4つのインターバルの2つの異なるセットをとり、100個の番号をソートし、1)挿入ソート、2)シェルソート、間隔として4つの数字、間隔で2番目の100でシェルソート、ソートされたリストをtxtファイルに出力、各ソートで行われる割り当て操作の量を印刷します(まだこの部分は行っていません)。挿入ソート対シェルソートプログラム。シェルソートは時間の一部しか動作しません

シェルソートの1つをコンパイルして実行すると、ソートが部分的にソートされているにもかかわらず、通常は完全には機能しません。完全にソートされていないシェルソートはどちらのソートでもかまいません。プログラムは一定の間隔で動作しますが、他のものでは動作しないと仮定しています。誰もが、私は問題は(INC1のような)「INC」ベクトルは常に最後の反復が通常の挿入ソートのようにする必要がありますので、このステップは、アルゴリズムによって必要とされる1で終わらないかもしれないことだと思います

/** 
* @(#)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; 
    } 
} 
} 


} 

答えて

1

を助けることができます(しかし、いくつかの要素が既にソートされているので、はるかに迅速です)。

その場合、コードに追加のチェックを追加することができます。そうでない場合は、例を挙げてください。

+0

「inc」配列は常に1つで終わると忘れていました。この問題は、shellSortの2番目の呼び出しで常に発生するようです。 2番目の呼び出しを妨げている値をリセットしない可能性はありますか? – ReezaCoriza

+0

shellSortを1回呼び出すだけです。おそらく、あなたはshellSortへの呼び出しを追加するのを忘れていたでしょうか? :-) 例を私に提供すればもっと簡単になります。 –

+0

haha​​。うん、それだった。答えは私がばかだからです。 – ReezaCoriza

関連する問題