码迷,mamicode.com
首页 > 编程语言 > 详细

双向冒泡排序

时间:2015-01-05 18:50:45      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:c++   namespace   经验   技术   计算机科学   

<center><h2>问题 G: 双向冒泡排序</h2></center><h2>题目描述</h2><div class="content"><h1 style="margin: 0px; font-size: 30px; line-height: 36px; font-family: 'Times New Roman'; color: rgb(51, 51, 51); text-rendering: optimizelegibility;"><span style="COLOR: rgb(255,0,0)">注:本题只需要提交填写部分的代码,请按照C++语言方式提交。</span></h1><p>双向冒泡从小到大排序算法描述:
(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),直到新序列没有元素。</p><p>#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;</p><p>        lastSwapPos = low; //设置未排序序列的第一个元素位置
<span style="COLOR: #ff0000">        /*
         请在该部分填写缺少的代码
        */</span>
        if (lastSwapPos == low) //若未进行交换操作,说明排序已经完
            break;
    }</p><p>    for(i = 0; i<n; i++)
        cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}</p><p></p></div><h2>输入</h2><div class="content"><p>n和n个整数</p></div><h2>输出</h2><div class="content"><p>从小到大排序后的数列</p></div><h2>样例输入</h2><pre class="content"><span class="sampledata">6
21 45 85 47 3 15</span>

样例输出

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;
}
技术分享

双向冒泡排序

标签:c++   namespace   经验   技术   计算机科学   

原文地址:http://blog.csdn.net/i__am__legend/article/details/42425211

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!