2012-12-14 39 views
1

我知道有一個簡單的方法做到這一點...說,我試圖使用選擇排序和stringBuilder類的字符串進行排序,但我得到一個無限循環。如果有人可以幫助,讚賞。 包第9Str; import java.util。*;使用選擇排序字符串排序alg

public class SortedString { 

    public static void main(String[] args) { 
     String input = "cabed"; 

     System.out.println(sort(input)); 
    } 

    public static String sort(String str) {  
     StringBuilder sb = new StringBuilder(str); 

     for(int i=0; i<sb.length()-1; i++) { 
      char tmp; 
      for(int j=i+1; j<sb.length(); j++) { 
       if(sb.charAt(j) < sb.charAt(i)) { 
        tmp = sb.charAt(i); 
        sb.insert(i, sb.charAt(j)); 
        sb.insert(j, tmp); 
       } 
      } 
     } 
     return sb.toString();  

    } 

} 
+0

你每次在循環中都插入兩個字符 - 我懷疑這是你的意圖。難道你不應該刪除兩個或更換它們嗎? – OldCurmudgeon

+0

順便說一句 - 這不是[選擇排序](http://en.wikipedia.org/wiki/Selection_sort)這是[冒泡排序](http://en.wikipedia.org/wiki/Bubble_sort) – OldCurmudgeon

+0

@OldCurmudgeon否它不是。交換命中的次數比它需要的次數多(最低值只能在tmp中跟蹤,然後在內部迴路末尾交換),但通過內部迴路,我是靜態的,並且在每次迭代結束時外部循環,確切地說,一個更多的值保證按順序排列,從最小到最大。 – femtoRgon

回答

3

每次交換時,實際上是增加了字符串的長度。

  if(sb.charAt(j) < sb.charAt(i)) { 
       tmp = sb.charAt(i); 
       sb.insert(i, sb.charAt(j)); 
       sb.insert(j, tmp); 
      } 

插入在指定位置騰出空間,而不是替換那裏的字符。例如,如果您以acbd開頭,則在您點擊該部分代碼後,您將剩下abccbd而不是abcd

我認爲你要找的是setCharAt方法。

+0

這正是問題....謝謝 – miatech