1. 程式人生 > >冒泡排序和選擇排序算法

冒泡排序和選擇排序算法

tails 多選 .com tostring 一次 com ati 技術分享 數字

冒泡排序原理

假設有10個數,第一輪循環,第一個數和第二個數比較,如果第一個數大,第一個數和第二個數交換位置,否則不動;接著第二個數和第三個數比較,如果第二個數大,第二個數和第三個數交換位置,否則不動……第九個數和第十個數比較,如果第九個數大,第九個數和第十個數交換位置,否則不動。第一輪循環結束,最大的數挪到了第十個數的位置,比較進行了9次。
第二輪循環,第一個數和第二個數比較,如果第一個數大,第一個數和第二個數交換位置,否則不動……第八個數和第九個數比較,如果第八個數大,第八個數和第九個數交換位置,否則不動。第二輪循環結束,第二大的數挪到了第九個數的位置,比較進行了8次。

……
第九輪循環,第一個數和第二個數比較,如果第一個數大,第一個數和第二個數交換位置,否則不動。第九輪循環結束,倒數第二大的數挪到了第二個數的位置,比較進行了1次。
總體原理:每輪比較找到最大的數。

冒泡排序的比較示意圖

技術分享圖片

冒泡排序算法:

 for (int j = 0; j < a.length - 1; j++) {
            for (int i = 0; i < a.length - 1 - j; i++) {
                if (a[i] > a[i + 1]) {
                    
// change temp = a[i + 1]; a[i + 1] = a[i]; a[i] = temp; } } }

選擇排序原理

假設有10個數,第一輪循環,第一個數和第二個數比較,如果第一個數大,第一個數和第二個數交換位置,否則不動;接著第一個數和第三個數比較,如果第一個數大,第一個數和第三個數交換位置,否則不動……第一個數和第十個數比較,如果第一個數大,第一個數和第十個數交換位置,否則不動。第一輪循環結束,最小的數挪到了第一個數的位置,比較進行了9次。

第二輪循環,第二個數和第三個數比較,如果第二個數大,第而個數和第三個數交換位置,否則不動……第二個數和第十個數比較,如果第二個數大,第二個數和第十個數交換位置,否則不動。第二輪循環結束,第二小的數挪到了第二個數的位置,比較進行了8次。
……
第九輪循環,第九個數和第十個數比較,如果第九個數大,第九個數和第十個數交換位置,否則不動。第九輪循環結束,倒數第二小的數挪到了倒數第二個的位置,比較進行了1次。

選擇排序的動態示意圖

技術分享圖片

選擇排序算法:

for (int j = 0; j <length- 1;j++) {
            for (int i = j; i < length- 1; i++) {
                if (a[j] > a[i + 1]) {
                    // change
                    temp = a[j];
                    a[j] = a[i + 1];
                    a[i + 1] = temp;
                }
            }
}

選擇排序(真)的寫法
在網上看算法動態圖時發現,很多選擇排序在每一輪比較會記住最小數字的下標,在這一輪比較結束後將最小的數和這一輪比較的第一個數交換。而不是像上面那樣每比較一次都有可能交換,因為上面一種算法沒有記錄最小元素的下標。按這種實現,代碼應該寫成這樣:

private static void seletSort(int[] a) {
        int length = a.length;
        int temp = 0;
        int minIndex;
        for (int j = 0; j <length- 1;j++) {
            minIndex = j;
            for (int i = j; i < length- 1; i++) {
                if (a[minIndex] > a[i + 1]) {
                    minIndex = i+1;
                }
            }
            temp = a[minIndex];
            a[minIndex]= a[j];
            a[j]=temp;
        }
        toString(a);
    }

選擇排序的意思應該是,在一輪比較中,選擇當前比較數中最小的那個,放到最前面的位置,從這個角度看,第二種寫法更符合選擇排序這個名字呢。(這樣寫避免了無意義的交換)


---------------------
作者:u011109881
來源:CSDN
原文:https://blog.csdn.net/u011109881/article/details/80038573

冒泡排序和選擇排序算法