2015-08-09 55 views
-5

我已经采取了10个输入和我的程序完美工作,但当我开始大量输入像100,1000我的程序不起作用,并得到一个错误或通常它停止工作。在java中排序100000输入程序,它显示错误在输出

那么我该如何解决它请给我解决方案。 下面是我写的代码:

package PROGARMS; 
import java.util.Random; 
import java.util.Scanner; 
public class Radix1 { 
public static void main(String[] args){ 
int i,j,k=0,x=10,m=0,n; 
Scanner k1=new Scanner(System.in); 
Random r=new Random(); 
System.out.println("enter number of elements u want to sort"); 
n=k1.nextInt(); 
int[] a=new int[n]; 
for(i=0;i<n;i++) 
{ 
    a[i]=r.nextInt(10000); 
} 

n=a.length; 

System.out.println("Array before sorting"); 
for(i=0;i<n;i++) 
    System.out.println(a[i]+" "); 
System.out.println(); 



int[] b=new int[n]; 
int[] z=new int[n]; 

int max=a[0]; 
for(i=1;i<n;i++) 
    { 
    if(max<a[i]) 
     max=a[i]; 

} 

int length=0; 
while(max!=0) 
{ 
    length++; 
    max=max/10; 
} 

//length=1; 
System.out.println("length="+length); 

    while(m<length){ 
     System.out.println("x="+x); 
for(i=0;i<n;i++) 
{ 
    b[i]=a[i]%x; 
} 

for(i=0;i<n;i++) 
{ 
    for(j=0;j<n;j++) 
    { 
    if(b[i]<b[j]) 
    { 
     int key=b[i]; 
     b[i]=b[j]; 
     b[j]=key;  
     } 
    } 
} 
for(int s=0;s<n;s++) 
    System.out.println("s="+s+",b[s]="+b[s]); 






    for(i=0;i<n;i++) 
{ 
    for(j=0;j<n;j++) 
    { 
    if(b[i]==a[j]%x) 
     { 
      if(k>=n) 
      { 
      System.out.println("k is greater,M="+m); 
      k=0; 
      } 
     //ystem.out.println("k="+k+",j="+j); 
     z[k]=a[j]; 


     a[j]=0; 

     k++; 
     } 
     } 


} 


for(int s=0;s<n;s++) 
a[s]=z[s]; 

//for(int s=0;s<n;s++) 
//System.out.println("s="+s+",a[s]="+a[s]); 



m++; 
x=x*10; 

k=0; 
System.out.println(); 
} 

    System.out.println("After sorting Final result"); 
    for(int s=0;s<n;s++) 
     System.out.println("s="+s+",a[s]="+a[s]); 
} 
    } 
+3

请修改您的问题以显示导致问题的代码。 – Blackwood

+2

真的没有办法回答这个问题。你的程序试图做什么,你写的代码是什么,当它失败时你看到了什么错误? – hugh

+0

这是一个基数排序的程序 –

回答

0

我想我知道了:在你的主排序循环,当你对面z移动从a值,你从a后您删除它们'重做。这很好,除非你将它们设置为0“删除”他们:

a[j]=0; 

事情是,0是一个有效的值,因此,如果您的循环在这个地方寻找值与0,这不删除它从考虑。这显示为k超出该数组,这会触发k is greater,M=消息,但这会被吞下并且程序继续。

你可以通过设置a[j]的值也不可能是解决这个问题:

a[j]=-1; 

这则不能被重复计算,并且错误消失。

我已经写了这个改变,并改变了警戒条件在下面抛出异常。我还为可读性添加了一些注释,并对日志进行了一些更改,使其更易读(尽管您的口味可能会有所不同)。

import java.util.Random; 
import java.util.Scanner; 

public class RadixSort { 
    public static void main(String[] args) { 
     int i, j, k = 0, x = 10, m = 0, n; 
     Random r = new Random(); 
     Scanner k1 = new Scanner(System.in); 
     System.out.println("Enter number of elements you want to sort"); 
     n = k1.nextInt(); 


     // Choose random numbers to sort 
     int[] a = new int[n]; 
     for (i = 0; i < n; i++) { 
      a[i] = r.nextInt(10000); 
     } 

     // Print initial array 
     System.out.println("Array before sorting"); 
     for (i = 0; i < n; i++) 
      System.out.print(a[i] + " "); 
     System.out.println(); 

     // Find the largest value 
     int max = a[0]; 
     for (i = 1; i < n; i++) { 
      if (max < a[i]) 
       max = a[i]; 

     } 

     // Find the (decimal) length of the longest value 
     int length = 0; 
     while (max != 0) { 
      length++; 
      max = max/10; 
     } 
     System.out.println("length=" + length); 

     // Main sort loop 
     int[] b = new int[n]; 
     int[] z = new int[n]; 
     while (m < length) { 
      // Place being sorted 
      System.out.println("x=" + x); 
      // `b` is a copy of `a` including only the digit to be sorted in this pass 
      for (i = 0; i < n; i++) { 
       b[i] = a[i] % x; 
      } 

      // Bubble sort `b` 
      for (i = 0; i < n; i++) { 
       for (j = 0; j < n; j++) { 
        if (b[i] < b[j]) { 
         int key = b[i]; 
         b[i] = b[j]; 
         b[j] = key; 
        } 
       } 
      } 

      // Print out the sorted `b` array 
      for (int s = 0; s < n; s++) 
       System.out.print(b[s]+","); 
      System.out.println(); 

      // Apply the sort from `b` to `a`. 
      for (i = 0; i < n; i++) { 
       for (j = 0; j < n; j++) { 
        // If the ith entry in `a` has the same digit as `b`, move it across 
        if (b[i] == a[j] % x) { 
         // XXX: Some kind of loop guard? This indicates an error, and should exit. 
         if (k >= n) { 
          throw new IllegalStateException("k is greater than n, when M=" + m); 
         } 
         // Move the jth value out of `a` into a temporary buffer `z`. 
         z[k] = a[j]; 

         // XXX: Problem is, '0' is a valid value. 
         a[j] = -1; 

         k++; 
        } 
       } 

      } 

      // Transcribe the sorted array back into `a` 
      for (int s = 0; s < n; s++) 
       a[s] = z[s]; 

      // Move on to the next digit. 
      m++; 
      x = x * 10; 
      k = 0; 
     } 

     // Print the final result 
     System.out.println("After sorting Final result"); 
     for (int s = 0; s < n; s++) 
      System.out.print(a[s]+","); 
     System.out.println(); 
    } 
}