排序算法之冒泡和快排


冒泡排序

顧名思義:參與排序的數據就像水中的氣泡慢慢浮出水面一樣“浮”到數列頂端。

冒泡排序要點:

1、  兩層循環,外層循環控制走訪數列重復進行的次數,內層循環進行數據的比較、交換,是數據“上浮”。

2、  內層循環是相鄰的數據進行比較。

C語言代碼實現:

// 冒泡排序
void sort_bubble(int n){
    int i,j;
    for(i=0;i<n-1;i++){
        for(j=0;j<n-1-i;j++){
            if(arr[j]>arr[j+1]){
                // 進行一次交換
                exchange(j,j+1);
            }
        }
    }
    
}

代碼優化:

通過對核心代碼的分析,不難發現,當給我們的數據已經是有序狀態時,外層循環仍舊會執行n-1次,內層循環因為數據已經有序,只會進行相鄰數據的比較而不進行數據的交換。這個時候我們的外層循環導致我們的程序做了很多的無用功。因此我們需要對外層循環進行優化。

我們已經知道,如果我們的數據已經是有序狀態時,程序的內層循環是只進行數據的比較而不進行數據的交換,那么我們可以在內層循環設置一個變量,用來通知外層循環數據是否已經達到有序狀態,如果已經有序,則跳出外層循環,否則,繼續執行。

優化代碼:

// 冒泡排序
void sort_bubble(int n){
    int i,j;
    int m;
    for(i=0;i<n-1;i++){
        m = 1;  // 默認數據已經為有序狀態
        for(j=0;j<n-1-i;j++){
            if(arr[j]>arr[j+1]){
                // 進行一次交換
                exchange(j,j+1);

                m = 0; // 數據進行了交換,說明數據還沒有達到完全有序狀態
            }
        }

        if(m==1){
            break; // 如果m=1,說明數據已經為有序狀態,跳出外層循環
        }
    }
    
}

快速排序:

快速排序是最常用的一種排序算法,因為速度快,效率高而得名。

快速排序采用的是分治思想。

(分治思想其實就是把一個復雜的問題分解成   與原問題性質相同且相互獨立的  若干個可以直接求解的小問題。)

快速排序思路:

  在一個給定的數據中,選一個元素作為基准值(這里選擇第一個元素),然后先從后往前遍歷,找到一個比這個基准值小的元素,把這個元素放到這個基准值的左邊,然后再從前往后遍歷,找到一個比基准值大的元素,放到這個基准值的右邊,直到遍歷所有元素。

  當我們遍歷一遍數據之后,以這個基准值為基點,分成兩組數據量小的數組,然后對這兩個數組繼續執行上述操作。

 

Java代碼:

public class QuickSort {

    // 快速排序
    public void sort_quick(int[] arr, int first, int last) {
        int start = first;
        int end = last;
        int key = arr[first];
        if (first >= last)
            return;
        int flag = 1; // 是否有序的標記

        while (start < end) {
            while (start < end && arr[end] >= key)
                end--;
            if (start < end) {
                arr[start] = arr[end];
                arr[end] = key;
                start++;
                flag = 0;
            }

            while (start < end && arr[start] <= key)
                start++;

            if (start < end) {
                arr[end] = arr[start];
                arr[start] = key;
                end--;
                flag = 0;
            }
        }

        arr[end] = key;
        if(flag == 1){
            return;
        }

        if (start > first) {
            sort_quick(arr, first, start - 1);
        }

        if (end < last) {
            sort_quick(arr, end + 1, last);
        }

    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM