OJ刷题之《双向冒泡排序》

题目描述

注:本题只需要提交填写部分的代码,请按照C++语言方式提交。

双向冒泡从小到大排序算法描述:

(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;

}

输入

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++,后面补充的代码也没有使用到它

时间: 2024-10-29 19:11:30

OJ刷题之《双向冒泡排序》的相关文章

OJ刷题之《输出不同进制的数》

题目描述 将十进制数1234按十进制输出 将八进制数1234按八进制输出 将十六进制数1234按十六进制输出 输入 无 输出 将十进制数1234按十进制输出 将八进制数1234按八进制输出 将十六进制数1234按十六进制输出 样例输入 无 样例输出 1234=1234D 01234=1234O 0x1234=1234H 提示 使用输出格式控制符 dec     oct     hex 输出第二行 01234=1234O    1234前是数字0,1234后是大写字母O 代码如下: #includ

OJ刷题之《输出A字打头的字符串》

Description 输出n个字符串,把其中以字母A打头的字符串输出. Input 第一行 n 第二行到第n+1行,每行一个字符串 Output A打头的字符串 Sample Input 3 Ada Bob Alice SampleOutput Ada Alice 代码如下: #include <iostream> #include <cstring> using namespace std; int main() { int i,n; string str[10]; cin&g

OJ刷题常用的4中基本输入形式

初到OJ网站上刷题,输入形式就是我们要考虑的问题.通过自己的一些摸索,OJ题目的输入形式大体上无外乎4种.下面就详细介绍: 1 输入数据文件中,第一行数据标明了测试数据的数目: 2 输入数据文件中,有标明输入结束的数据 3 输入数据文件中,测试数据一直到文件尾 4 没有输入数据 第1中情形的处理方法: //int i,kase scanf("%d",&kase); for(i=1;i<=kase;i++) { //处理第i中情况 } ...................

OJ刷题之《成绩输出》

Description 输入n(<=10)个学生的姓名.学号和成绩,将其中不及格者的姓名.学号和成绩输出. Input 第一行 n 第二行到第n+1行,每行一个学生的姓名.学号和成绩. Output 不及格者的姓名.学号和成绩. Sample Input 3 zhang 1001 100 li 1002 59 sun 1003 0 SampleOutput li 1002  59 sun 1003  0 代码如下: #include <iostream> using namespace

OJ刷题之《输入三个整数,按由小到大的顺序输出》

题目描述 输入三个整数,按由小到大的顺序输出.分别使用指针和引用方式实现两个排序函数.在主函数中输入和输出数据. 输入 三个整数 输出 由小到大输出成一行,每个数字后面跟一个空格.由指针方式实现. 由小到大输出成一行,每个数字后面跟一个空格.由引用方式实现. 样例输入 2 3 1 样例输出 1 2 3 1 2 3 提示 主函数已给定如下,提交时不需要包含下述主函数 /* C++代码 */ int main() { void sort1(int *,int *,int *); void sort2

第十五周oj刷题——Problem E: C++习题 对象数组求最大值

Description 建立一个对象数组,内放n(<10)个学生的数据(学号.成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出n个学生中成绩最高者,并输出其学号. Input n和n个学生的学号.成绩 Output 成绩最高者的学号和成绩 Sample Input 5 101 78.5 102 85.5 103 98.5 104 100.0 105 95.5 Sample Output 104 100.00 /* All rights reserved. * 文件名称:

基于C#解决OJ刷题之输入输出问题的总结(AKOJ1064-1071A+B问题汇总)

声明:题目部分为akoj题目,代码为本人AC代码. 因为本人学校的oj支持各种环境,非常正常的当中就包括了C#.然暑假在家较为空暇,本着学习C#和复习算法的态度和目的,就又開始折腾起oj了. 题目部分是最基础的A+B系列,来看看C#的输入输出是怎么一回事吧 题目地址:http://183.167.205.82:8081/JudgeOnline/problemlist?volume=1 本文由csdn-jtahstu原创.转载请注明出处,欢迎志同道合的朋友一起交流学习.本人QQ:137375842

第十五周oj刷题——Problem I: C++ 习题 比较大小-类模板

Description 声明一个类模板,利用它分别实现两个整数.浮点数和字符的比较,求出大数和小数.说明:在类模板外定义各成员函数. Input 输入两个整数.两个浮点数和两个字符 Output 从大到小输出两个整数.两个浮点数和两个字符 Sample Input 3 7 45.78 93.6 a A Sample Output 7 3 93.60 45.78 a A   /* All rights reserved. * 文件名称:test.cpp * 作者:陈丹妮 * 完成日期:2015年

oj刷题——第十五周C++习题 对象转换

Description 定义一个Teacher(教师)类(教师号,姓名,性别,薪金)和一个Student(学生)类(学号,姓名,性别,成绩),二者有一部分数据成员是相同的,num(号码),name(姓名),sex(性别).编写程序,将一个Student对象(学生)转换为Teacher(教师)类,只将以上3个相同的数据成员移植过去.可以设想为: 一位学生大学毕业了,留校担任教师,他原有的部分数据对现在的教师身份来说仍然是有用的,应当保留并成为其教师数据的一部分. Input 一个教师的信息和一个学

第十五周oj刷题—— Problem C: 矩形类中运算符重载【C++】

Description 定义一个矩形类,数据成员包括左下角和右上角坐标,定义的成员函数包括必要的构造函数.输入坐标的函数,实现矩形加法,以及计算并输出矩形面积的函数.要求使用提示中给出的测试函数并不得改动. 两个矩形相加的规则是:决定矩形的对应坐标分别相加,如 左下角(1,2),右上角(3,4)的矩形,与 左下角(2,3),右上角(4,5)的矩形相加,得到的矩形是 左下角(3,5),右上角(7,9)的矩形. 这个规则没有几何意义,就这么定义好了. 输出面积的功能通过重载"<<&quo