1. 程式人生 > >OJ陣列——雙向氣泡排序

OJ陣列——雙向氣泡排序

/*
 * Copyright (c) 2014, 煙臺大學計算機學院
 * All rights reserved.
 * 檔名稱:test.cpp
 * 作    者:李曉凱
 * 完成日期:2015年 1 月 9 日
 * 版 本 號:v1.0

 *

雙向冒泡從小到大排序演算法描述:
(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;
}

Input

n和n個整數

Output

從小到大排序後的數列

Sample Input

6
21 45 85 47 3 15

Sample Output

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-1];
        		a[i-1]=a[i];
        		a[i]=temp;
        		low=i;
        	}
        }
        if (lastSwapPos == low) 
            break;
    }

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