Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使用while语句时进行冒泡排序_Arrays_Sorting_While Loop_Bubble Sort - Fatal编程技术网

Arrays 使用while语句时进行冒泡排序

Arrays 使用while语句时进行冒泡排序,arrays,sorting,while-loop,bubble-sort,Arrays,Sorting,While Loop,Bubble Sort,我必须编写代码对一些数字进行排序,虽然我决定使用“for”而不是“while”,但我想知道为什么它会这样做。它把所有的东西都分类了,但是它把14号留在了原来的位置,如果有人能解释一下的话,我会非常感激的 public class SortForMe { public static void main(String args[]) { int ListOfNumbers[] = {16, 100, 205, 8, 1, 3, 2, 5, 7, 6, 15, 10, 14}; int Length

我必须编写代码对一些数字进行排序,虽然我决定使用“for”而不是“while”,但我想知道为什么它会这样做。它把所有的东西都分类了,但是它把14号留在了原来的位置,如果有人能解释一下的话,我会非常感激的

public class SortForMe {

public static void main(String args[]) {
int ListOfNumbers[] = {16, 100, 205, 8, 1, 3, 2, 5, 7, 6, 15, 10, 14};
int Length = ListOfNumbers.length;
int Sorted = 1;
int T;
int Order = 0;
System.out.println("Given number :");
while(Order < Length) {
  System.out.println("  " + ListOfNumbers[Order]);
  Order++;
                     }
System.out.println("\n");
System.out.println("After Sort:");
while (Sorted < Length) {
  while (Order < Length - Sorted) {
    if (ListOfNumbers[Order] > ListOfNumbers[Order + 1]) {
      int temp = ListOfNumbers[Order];
      ListOfNumbers[Order] = ListOfNumbers[Order + 1];
        ListOfNumbers[Order + 1] = temp;
    }
    Order++;
  }
  Order = 0;
  Sorted++;

}
while(Order < Length) {
  System.out.println(ListOfNumbers[Order]);
  Order++;
}
}
}
公共类排序格式{
公共静态void main(字符串参数[]){
int-listofNumber[]={16,100,205,8,1,3,2,5,7,6,15,10,14};
int Length=ListOfNumbers.Length;
int=1;
int T;
整数阶=0;
System.out.println(“给定编号:”);
while(顺序<长度){
System.out.println(“+listofNumber[订单]);
订单++;
}
System.out.println(“\n”);
System.out.println(“排序后:”);
while(排序<长度){
while(顺序<长度-排序){
if(ListOfNumber[Order]>ListOfNumber[Order+1]){
int temp=列表编号[顺序];
ListofNumber[顺序]=ListofNumber[顺序+1];
ListofNumber[订单+1]=临时订单;
}
订单++;
}
顺序=0;
排序++;
}
while(顺序<长度){
System.out.println(编号列表[订单]);
订单++;
}
}
}

这是因为在第一个循环中使用变量
Order
来显示数组的初始状态

当它在内部循环中使用时,它已经在数组的末尾,因此在第一次迭代中没有排序。
Sorted
变量增加,最后一项未排序

插入
顺序=0在显示初始状态的循环和执行排序的循环之间


旁注:气泡排序缺少一些东西。它应该检查内部循环中是否有任何交换。否则,排序就完成了,您可以退出外部循环。

您的实现看起来有点复杂。我建议您重构并将排列代码放在一个单独的方法中,以使其更具可读性。此外,您还应该在每次迭代时检查是否存在任何排列。如果没有排列,那么就完成了。否则,您应该再次迭代。通过一些重构,事情变得简单了

这是我用您的输入完成并测试的一个实现

此“SimpleBulleSort”方法依赖于交换方法和printArray方法(见下文)

printArray可以在每次迭代后对数组进行漂亮的打印,这样我们就可以直观地看到发生了什么

 public void swap(int[] datas, int position1, int position2)
 {
     int temp = datas[position1];
     datas[position1] = datas[position2];
     datas[position2] = temp;
 }
这是一个使用输入数据的演示代码

 public static void doDemo() {
     
     int[] datas = {16, 100, 205, 8, 1, 3, 2, 5, 7, 6, 15, 10, 14};
     (new BubbleSort()).simpleBubbleSort(datas);
 }
 
 public static void main(String[] args) {
     doDemo();
     
 }
结果如下:

[100 205 16 8 3 2 5 7 6 15 10 14 1]

[205 100 16 8 3 5 7 6 15 10 14 2 1]

[205 100 16 8 5 7 6 15 10 14 3 2 1]

[205 100 16 8 7 6 15 10 14 5 3 2 1]

[2051001687151465321]

[205 100 16 8 15 10 14 7 6 5 3 2 1]

[205 100 16 15 10 14 8 7 6 5 3 2 1]

[205 100 16 15 14 10 8 7 6 5 3 2 1]

[205 100 16 15 14 10 8 7 6 5 3 2 1]


当然,您可以通过将比较更改为
>0
而不是
,使其升序。您只需再执行一个循环,使int Sorted=0;
 public void swap(int[] datas, int position1, int position2)
 {
     int temp = datas[position1];
     datas[position1] = datas[position2];
     datas[position2] = temp;
 }
 public static void doDemo() {
     
     int[] datas = {16, 100, 205, 8, 1, 3, 2, 5, 7, 6, 15, 10, 14};
     (new BubbleSort()).simpleBubbleSort(datas);
 }
 
 public static void main(String[] args) {
     doDemo();
     
 }