2013-10-12 24 views
0

我寫了一個程序,我必須寫出一個快速排序的代碼。我正在使用一個Comparable []數組。爲了交換數組的兩個元素,我必須在變量中存儲一個元素。通常,對於字符串數組,我可以將該元素存儲在字符串變量中,但不允許將該值存儲在具有Comparable Array的字符串變量中。我如何從這個數組外的這個Comparable數組中存儲一個元素,這樣我就可以交換這兩個元素了?這就是我的程序的樣子,我卡在的部分沒有代碼。如何在變量中存儲一個Comparable元素?

import java.io.*; 

public class QuickSort{ 
public static void main (String args[]) {  
    Comparable[] q = Read(); 
    int l = 0; 
    int x = q.length-1; 
    QSortr(q, l, x); 
    PrintFxn(q); 
} 

public static Comparable[] Read() { 
String hold[] = new String[1000]; 
int numin=0; 
try{ 
     BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 
     String s; 
     s=br.readLine(); 
     while (s!=null&& !s.equals("")) { 
      hold[numin]= s; 
      numin++; 
      s=br.readLine(); 
     } 
     br.close(); 

    } catch (Exception e) {System.out.println("Ack!:" + e); } 
    Comparable q[] = new String[numin]; 
    for(int a=0; a<numin; a++) { 
     q[a] = hold[a]; 
    } 
    return q; } 

public static int QSort(Comparable q[], int l, int x) { 
    int r = l +1; 
    int m= l; 
    int k = l; 

while(r<q.length-1){ 
    if(q[r].compareTo(q[k])<=0){ 
     m++; r++; } 
    else{ 
     while(q[r].compareTo(q[k])>0&&r<q.length-1){ 
      r++; } 
     m++; 
     //This is where i'm stuck... 
     q[r] = q[m]; 
     q[m] = a[0]; } 
    } 
    return m;} 
public static Comparable [] QSortr(Comparable q [], int l, int x) { 
    while(l<x) { 
     int a = QSort(q, l, x); 
     QSortr(q, l, a-1); 
     QSortr(q, a+1, x); } 
    return q; } 

public static void PrintFxn(Comparable[] q) { 
    for(int a=0; a<q.length; a++) { 
    System.out.println(q[a]); } 
} 
} 
+0

也許我很密集,但不能使用,呃,使用Comparable? – tom

+0

這正是我想知道的是,這可能/允許/合乎邏輯嗎? –

回答

0

有在此實現快速排序的「到位」許多錯誤的事情,其中​​之一是條件:while(r<q.length-1) - 你應該停止循環時r > x。另一個問題是,您在QSort中完全不使用x(右邊界)。 查看以下quickSort的實現 - 即使它在Ruby中 - 它很容易遵循:主要思想是運行兩個指針 - 一個從右到左,另一個從左到右,當它們彼此交叉時停止,但同時運行檢查以查看是否存在小於的元素,其中樞軸的右側是,樞軸的左側是否更大,以及它們之間是否切換。

+0

感謝您對第一部分的幫助。但是,我的老師希望我們使用這種分區方法,因爲它需要更少的代碼。正確的界限只是作爲一個終點而已。我們確實學過這兩種類型,但他相信這樣比較好。 –

+0

「就地」版本不是「少代碼」 - 它使用較少的內存空間,因爲所有操作都是在陣列本身上執行的,而不需要複製。 – alfasin

相關問題