冒泡排序算法

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换的元素为止,这意味着数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(或说是排序的开头位置),就如同水中的气泡一样上升到水面。

冒泡排序的写法可以简单分为两种方式,分别是:前同后异、前异后同

写法1:前同后异

前同就是指:for循环中的变量i和j都是从零开始

后异就是指:for循环的判断条件i为n - 1,j为n - i - 1

 public static void bubbleSort(int[] arr) {  
        int n = arr.length;  
        for (int i = 0; i < n - 1; i++) { // 外层循环,控制排序的轮数  
            for (int j = 0; j < n - i - 1; j++) { // 内层循环,进行相邻元素的比较和交换  
                // 比较相邻元素,如果顺序错误则交换  
                if (arr[j] > arr[j + 1]) {  
                    // 交换arr[j]和arr[j+1]  
                    int temp = arr[j];  
                    arr[j] = arr[j + 1];  
                    arr[j + 1] = temp;  
                }  
            }  
        }  
    }  

写法2:前异后同

前异就是指:for循环中的变量i为0, j为i + 1

后异就是指:for循环的判断条件i和j为n - 1

public static void bubbleSortVariant(int[] arr) {  
    int n = arr.length;  
    for (int i = 0; i < n - 1; i++) { // 外层循环,控制排序的轮数  
        for (int j = i + 1; j < n - 1; j++) { // 内层循环,从i+1开始,并确保不会越界  
            // 比较相邻元素,如果顺序错误则交换  
            if (arr[j] > arr[j + 1]) {  
                // 交换arr[j]和arr[j+1]  
                int temp = arr[j];  
                arr[j] = arr[j + 1];  
                arr[j + 1] = temp;  
            }  
            // 注意:这里没有处理j=n-2时与arr[n-1]的比较,  
            // 因为在下一轮外层循环中,i将增加到n-2,然后j将从n-1开始(但内层循环条件会阻止它执行任何操作)  
        }  
        // 实际上,当i=n-2时,内层循环不会执行任何操作,  
        // 因为j从n-1开始,而内层循环的条件是j < n-1,这是不成立的。  
        // 但这并不影响算法的正确性,因为当只剩下一个元素时,它自然是有序的。  
    }  
}

你可能感兴趣的:(常用算法,算法)