1. 程式人生 > >Problem D: 雙向冒泡排序

Problem D: 雙向冒泡排序

\n ont ++ %d stream 第一個 har == 語言

Problem D: 雙向冒泡排序

Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 447 Solved: 197
[Submit][Status][Web Board]

Description

註:本題只需要提交填寫部分的代碼

雙向冒泡從小到大排序算法描述:
(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),直到新序列沒有元素。

C++語言方式

#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;
}

C語言方式

#include <stdio.h>

int main(){

int a[100],i,n;

scanf("%d",&n);

for(i=0; i<n; i++)

scanf("%d",&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++)

printf("%d ",a[i]);

printf("\n");

return 0;

}

Input

n和n個整數

Output

從小到大排序後的數列

Sample Input

6
21 45 85 47 3 15

Sample Output

3 15 21 45 47 85
 for(i=high-1;i>low;i--)
        {
            if(a[i]<a[i-1])
            {
                temp=a[i];
                a[i]=a[i-1];
                a[i-1]=temp;
            }
        }
        lastSwapPos=i;

  

 

Problem D: 雙向冒泡排序