1. 程式人生 > >OJ刷題之《雙向氣泡排序》

OJ刷題之《雙向氣泡排序》

題目描述

注:本題只需要提交填寫部分的程式碼,請按照C++語言方式提交。

雙向冒泡從小到大排序演算法描述:1)從當前序列的第1個元素開始,對相鄰元素從前往後兩兩比較,不滿足條件(從小到大)則彼此交換,一直到序列結束。此時最後1個元素為最大值。2)從當前序列的倒數第2個元素開始,對相鄰元素從後往前兩兩比較,不滿足條件則彼此交換,一直到序列開始。此時第1個元素為最小值。3)將第2個元素作為新序列的開始,倒數第2個元素作為新序列的結束,重複(1)~(2),直到新序列沒有元素。改進的雙向冒泡從小到大排序演算法描述:a)在上述演算法第(1)步,記錄每次的交換位置,令high表示最後1次交換位置

,若比較過程未發生交換,則演算法結束;b)在演算法第(2)步,只需要從high向前比較即可,比較過程中記錄每次的交換位置,令low表示最後1次交換位置,若比較過程未發生交換,則演算法結束;c)在演算法第(3)步,令新序列為開始位置為low,結束位置為high,重複(a)~(b),直到新序列沒有元素。

#include<iostream>
using namespace std;
int main()
{
    int a[100],i,n;
    cin>>n;
    for(i=0; i<n; i++)
        cin>> a[i];
    int low, high,lastSwapPos,temp,cnt;
    low = 0;
    high = n - 1;
    while (low < high)
    {
        lastSwapPos = high; //

設定未排序序列的最後一個元素位置
        for (i=low; i<lastSwapPos; i++)
        {
            cnt++;
            if(a[i]>a[i+1])
            {
               temp = a[i];
               a[i] = a[i+1];
               a[i+1] = temp;
               high = i;       //
記錄交換位置
            }
        }
        if (lastSwapPos == high) //
若未進行交換操作,說明排序已經完成
            break;

       lastSwapPos = low; //設定未排序序列的第一個元素位置       /*
        
請在該部分填寫缺少的程式碼
        */

        if (lastSwapPos == low) //
若未進行交換操作,說明排序已經完
            break;
    }

   for(i = 0; i<n; i++)
        cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}

輸入

nn個整數

輸出

從小到大排序後的數列

樣例輸入

6
21 45 85 47 3 15

樣例輸出

3 15 21 45 47 85

程式碼如下:

#include<iostream>
using namespace std;
int main()
{
    int a[100],i,n;
    cin>>n;
    for(i=0; i<n; i++)
        cin>> a[i];
    int low, high,lastSwapPos,temp,cnt;
    low = 0;
    high = n - 1;
    while (low < high)
    {
        lastSwapPos = high; //設定未排序序列的最後一個元素位置
        for (i=low; i<lastSwapPos; i++)
        {
            cnt++;
            if (a[i]>a[i+1])
            {
                temp = a[i];
                a[i] = a[i+1];
                a[i+1] = temp;
                high = i;       //記錄交換位置
            }
        }
        if (lastSwapPos == high) //若未進行交換操作,說明排序已經完成
            break;
        lastSwapPos = low; //設定未排序序列的第一個元素位置
        for (i=high; i>lastSwapPos; i--)
        {
            if (a[i]<a[i-1])
            {
                temp = a[i];
                a[i] = a[i-1];
                a[i-1] = temp;
                low = i;       //記錄交換位置
            }
        }
        if (lastSwapPos == low) //若未進行交換操作,說明排序已經完
            break;
    }
    for(i = 0; i<n; i++)
        cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}

執行結果:


大早上起來就被這個專案困擾了半個多小時,無論怎麼修改需要補充的程式碼都是得不出正確結果,用了單步除錯才突然發現問題。。。原來我之前某次修改的時候改錯了地方,把原始碼中的迴圈給改動了...哭醉...

不明白的是那個cnt有什麼作用,沒有初始化,還出現了cnt++,後面補充的程式碼也沒有使用到它