1. 程式人生 > >冒泡排序--兩種優化方式

冒泡排序--兩種優化方式

元素 下標 [0 void 臨時變量 [] cnblogs 數組下標 blog

原始版本

void bubble_sort(int arr[],int n){
    int tmp;
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; i < n; ++j)
        {
            if (arr[j] < arr[j+1])
            {
                tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
}

優化版本一

 如果內層循環沒有進行交換,說明後面的元素已經有序,則不需要繼續循環。因此,我們可以設置一個標記來標誌一趟比較是否發生交換。如果沒有發生交換,則數組已經有序。

void bubble_sort(int arr[],int n){
    int tmp;
    int flag ;
    for (int i = 0; i < n; ++i)
    {
        flag = false;
        for (int j = 0; i < n; ++j)
        {
            if (arr[j] < arr[j+1
]) { flag = true; tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } if (!flag) break; } }

優化版本二

  如果數組A[i....n]已經有序,那麽,內層循環只需要遍歷A[0....i]即可。因此,我們可以使用一個臨時變量來記錄最後一次交換的數組下標。

  

void bubble_sort(int arr[],int n){
    int tmp;
    int flag ;
    int k = n;
    int s = 0;
    for (int i = 0; i < n; ++i)
    {
        flag = false;
        for (int j = 0; i < k; ++j)
        {
            if (arr[j] < arr[j+1])
            {
                flag = true;
                tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
                s = j;//保存最後一次交換的下標;
            }
        }

        if (!flag)
            break;
        k = s;//最後一次交換的位置給k,減少比較的次數;
    }
}

冒泡排序--兩種優化方式