2012-12-14 42 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