冒泡只按单循环排序

时间:2016-04-22 13:05:25

标签: java sorting

我正在通过冒泡排序对数字进行排序。我想看看这个排序是否可以通过仅使用单个循环完成,因为我们在冒泡排序中使用2个循环。有人可以告诉我它是如何完成的,甚至是否可能?

2 个答案:

答案 0 :(得分:3)

冒泡排序的工作方式是移动彼此相邻的值对。所以,例如,你有这个清单:

list = {5, 3, 6, 11, 2}

第一次迭代,将逐对配对,如果必要则切换位置:

  1. 比较5和3. 3更小,所以你切换=> {3, 5, 6, 11, 2}
  2. 比较5和6. 5更小,所以你什么都不做=> {3, 5, 6, 11, 2}
  3. 比较6和11. 6较小,所以你什么都不做=> {3, 5, 6, 11, 2}
  4. 比较11和2. 2更小,所以你女巫=> {3, 5, 6, 2, 11}
  5. 我们已完成循环的1次迭代,如您所见,列表未排序。您需要多次迭代才能实现排序。

    但是,可以做的是只使用一个循环来保持迭代直到它被排序,这可以通过根据原始冒泡排序切换标志来改变迭代索引来实现:

    bool valuesSwitched = false;
    int list[5] = {5, 3, 6, 11, 2};
    int len = 5;
    for(int i = 1; i <= len; i++)
    {
        if(i == len)
        {
            if(!valuesSwitched) break;
    
            valuesSwitched = false;
            i = 1;
        }
        if(list[i - 1] > list[i])
        {
            int temp = list[i - 1];
            list[i - 1] = list[i];
            list[i] = temp;
            valuesSwitched = true;
        }
    }
    

答案 1 :(得分:0)

我们可以在最佳情况下实现O(n)的冒泡排序。

冒泡排序中的最佳情况是整个数组的排序。在这种情况下,您比较第一遍中的相邻元素,并跟踪您所进行的交换次数。

完整数组排序后,您的掉期数将为零。因此,你将摆脱循环。

我们将通过对传统的冒泡排序算法进行一些小改动来得到答案。

public class BubbleSort {

    public static void main(String args[]){
        int arr[] = {1,2,3,4,5,6};
        BubbleSort bubbleSort = new BubbleSort();
        bubbleSort.sort(arr);

        for(int i=0; i <arr.length; i++){
            System.out.print(arr[i]);
        }
    }

    public void sort(int arr[]){
        boolean flag = true;
        for(int i=0; i < arr.length -1; i++ ){
            for(int j=0; j<arr.length-i-1; j++){
                if(arr[j]>arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                    flag=false;
                }
            }
            if(flag){
                break;
            }
        }
    }
}