C语言将一组数从大到小排序 只能移动相邻的数 并且要求步骤最小 怎么设计逻辑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言将一组数从大到小排序 只能移动相邻的数 并且要求步骤最小 怎么设计逻辑相关的知识,希望对你有一定的参考价值。

题目要求把数组从大到小排序,并且只能移动相邻的数据,这就相当于规定了,只能实现冒泡排序的算法。问题是题目要求冒泡排序进行时要达到移动相邻数据的次数最少,其实这是一个伪命题,因为在这种算法下,并不存在移动数据次数多或少的问题。
因为移动数据次数的多少是与数据原来的逆序数对的多少决定了的,你逆序数对有多少,移动次数就有多少。因为在冒泡排序中每交换一次(移动数据一次)逆序数对就减少一对,所谓改进的冒泡排序算法也只是减少比较的次数而已,效率低的冒泡算法也只是走完了全部的比较。尽管在最后的几轮比较中,浪费了多余的循环和比较,但是并不需要移动。
综上所述,只要用基本的冒泡算法,就可以达到题目的要求了。
参考技术A 冒泡排序?你百度一下

C语言实验7_宏与位运算

C语言实验7_宏与位运算

实验07(01)带参数宏的定义

题目描述
定义一个带参数的宏,实现两个数从大到小的排序。利用该宏定义编程实现输入两个数,输
出排序后的情况。
输入描述
输入双精度数。
输出描述
按 printf("%.2f,%.2f\\n",a,b)从大到小的顺序输出排序结果,逗号为英文
输入样例
3,5
输出样例
5.00,3.00
#include <stdio.h>
#define scan(a, b) scanf("%lf,%lf", &a, &b)
#define print(a, b) a > b ? printf("%.2lf,%.2lf\\n", a, b) : printf("%.2lf,%.2lf\\n", b, a)
int main()

    double a, b;
    scan(a, b);
    print(a, b);
    return 0;

实验07(02)用带参宏求三个数的最大值

c-lab7-2 用带参宏求三个数的最大值
题目描述
定义一个带参数的宏 SEQ(x,y,z),实现只用一个宏求三个数中的最大值。
输入描述
依次输入三个双精度数
输出描述
输出其中的最大值 printf("MAX=%.2f",MAX(a,b,t))。
输入样例
1,2,3.6789
输出样例
MAX=3.68
#include <stdio.h>
#define MAX(x, y, z) x > y &&x > z ? x : (y > z && y > x ? y : (z > x && z > y ? z : 1))
int main()

    double x, y, z;
    scanf("%lf,%lf,%lf", &x, &y, &z);
    printf("MAX=%.2lf\\n", MAX(x, y, z));
    return 0;

实验07(03)位运算取一个数中的某一位

题目描述
编写函数,实现将一个数(unsigned short)n 中的第 m 位取出来,并输出该位的值(从右
到左第 m 位)。
输入描述
输入:依次输入无符号数 n 和位数 m,逗号为英文。
输出描述
输出:第 m 位的值。
输入样例
5,1
输出样例
0
#include <stdio.h>
void ff(unsigned short n, int m);
int main()

    unsigned short n, m;
    scanf("%hu,%hu", &n, &m);
    ff(n, m);
    return 0;

void ff(unsigned short n, unsigned short m)

    unsigned short z;
    z = ((n & (1 << m)) >> m);
    printf("%hu\\n", z);

实验07(04)高四位与低四位交换

c-lab7-4 位运算:将一个数的高四位与低四位交换题目描述
编写函数,实现将一个数(8 位二进制)中的高四位和低四位交换。
输入描述
输入一个整数
输出描述
以十进制输出变换后的整数
输入样例
165
输出样例
90
#include <stdio.h>
void ff(unsigned short a);
int main()

    unsigned short a;
    scanf("%hd", &a);
    ff(a);
    return 0;

void ff(unsigned short a)

    unsigned short x, y;
    x = (a & 0x0f) << 4; //165 1010 0101
    y = (a & (0xf0)) >> 4;
    printf("%hd\\n", x + y);

实验07(05)对要求的位进行处理

题目描述
编写函数,实现将一个数中最低字节第 0、2、4、6 位按位取反,而其他位不变(从左到右)。
输入描述
输入一个整数。
输出描述
只输出最低字节数值。
输入样例
43690
输出样例
0
#include <stdio.h>
void ff(unsigned int a);
int main()

    unsigned int a;
    scanf("%d", &a);
    ff(a);
    return 0;

void ff(unsigned int a)

    unsigned int x, y, z, t;
    x = a & 0xff;
    y = x & 0xaa;
    t = x & 0x55;
    z = (~y) & 0xff - 0x55 + t;
    printf("%d\\n", z);

实验07(06)循环移位

题目描述
编写函数实现将一个短整型数据(0x5545)循环左移 n 位。所谓循环左移 1 位,即将最高位
存放到最低位,而其他位左移一位。如将 101100111010 左移一位后为:011001110101;如
果将原数左移两位则为:110011101010。
输入描述
输入移位的位数
输出描述
以十六进制输出移位后短整型数。
输入样例
1
输出样例
aa8a
#include <stdio.h>
void ff(int n);
int main()

    int n;
    scanf("%d", &n);
    ff(n);
    return 0;

void ff(int n)

    unsigned short a, x, y;
    a = 0x5545;
    x = a << n;
    y = a >> (16 - n);
    printf("%0x\\n", x + y);

实验07(07)利用位运算实现奇校验

题目描述
编写函数,利用位运算符实现对一个数中除最高位以外的其他二进制数进行奇校验(奇校验
就是在最高位的位置上加入一个值为1或为0的位,使该字节各个位中1的数量相加为奇数),
并将校验位存放到最高位。
例如:×0111001 →10111001
×0010101 →00010101
输入描述
输入需要校验的整数(小于 256)
输出描述
以十六进制输出被校验后的数据。
输入样例
10
输出样例
8a
#include <stdio.h>
#include <math.h>
void main()

    unsigned int x, y;
    unsigned int after(unsigned int a);
    scanf("%d", &x);
    y = after(x);
    printf("%0x\\n", y);

unsigned int after(unsigned int a)

    int i, b = 0;
    for (i = 0; i < 7; i++)
        b += (a & (1 << i));
    if (b % 2 == 0)
        a = (a & ~0) + (unsigned int)(1 << 7);
    else
        a = (a & ~(unsigned int)(1 << 7));
    return (a);

以上是关于C语言将一组数从大到小排序 只能移动相邻的数 并且要求步骤最小 怎么设计逻辑的主要内容,如果未能解决你的问题,请参考以下文章

c语言实现输入一组数自动从大到小排列

C语言实现简化版桶排序

C语言数组排序问题

将mysql某个数据库中表的行数从大到小排序

C语言—冒泡排序

C语言—冒泡排序