zoukankan      html  css  js  c++  java
  • Problem D: 双向冒泡排序

    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;
    

      

     
  • 相关阅读:
    D11 列表 list 元祖 字典dict
    D10 基本数据类型(各种职业的技能分析) 主要为 int 和 str
    Python D9 学习
    面向对象方法传参实现数组求和,求平均值
    用带参数的方法给空数组放元素,寻找数组里面的值是否存在。
    两种方法把类和对象写在同一个文件内
    创建一个管理员对象,输入正确用户名和密码,可以修改密码(类和对象分为两个文件,区别于放在一个文件内)
    创建一个游客对象,输入信息判断游客年龄是否免费游览
    建立一个学生对象,输出学生信息
    把输入的数字转为数组,拿出其中的最小值
  • 原文地址:https://www.cnblogs.com/mjn1/p/8908529.html
Copyright © 2011-2022 走看看