OJ刷題之《雙向氣泡排序》
題目描述
注:本題只需要提交填寫部分的程式碼,請按照C++語言方式提交。
雙向冒泡從小到大排序演算法描述:(1)從當前序列的第1個元素開始,對相鄰元素從前往後兩兩比較,不滿足條件(從小到大)則彼此交換,一直到序列結束。此時最後1個元素為最大值。(2)從當前序列的倒數第2個元素開始,對相鄰元素從後往前兩兩比較,不滿足條件則彼此交換,一直到序列開始。此時第1個元素為最小值。(3)將第2個元素作為新序列的開始,倒數第2個元素作為新序列的結束,重複(1)~(2),直到新序列沒有元素。改進的雙向冒泡從小到大排序演算法描述:(a)在上述演算法第(1)步,記錄每次的交換位置,令high表示最後1次交換位置
#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;
}
輸入
n和n個整數
輸出
從小到大排序後的數列
樣例輸入
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++,後面補充的程式碼也沒有使用到它