41.排序练习题(王道2023数据结构第8章综合练习)

news2024/10/7 12:22:28

试题1(王道8.3.3节综合练习2):

编写双向冒泡排序算法,在正反两个方向交替扫描。即第一趟把关键字最大的元素放在序列的最后面,第二趟把关键字最小的元素放在序列最前面,如此反复。

首先实现冒泡排序:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define ElemType int

void BubbleSort(ElemType a[],int n){
    int x;
    bool flag = false;
    for (int i = 0; i < n;i++){
        flag = false;
        for (int j = n - 1; j > i;j--){
            if(a[j-1] > a[j]){
                x = a[j - 1];
                a[j - 1] = a[j];
                a[j] = x;
                flag = true;
            }
        }
        if (flag == false)
            return;
    }
}

int main(){
    int a[7] = {4, 3, 2, 7, 6, 8, 9};
    BubbleSort(a, 7);
    for (int i = 0; i < 7;i++){
        printf("%d ", a[i]);
    }
}

输出:

2 3 4 6 7 8 9 

然后实现所谓的双向:把i%2这个条件加上去即可:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define ElemType int

void BubbleSort(ElemType a[],int n){
    int x;
    bool flag = false;
    for (int i = 0; i < n;i++){
        if(i % 2 == 0){
            for (int j = 0; j < n - 1 - i; j++){
                if(a[j] > a[j+1]){
                    x = a[j + 1];
                    a[j + 1] = a[j];
                    a[j] = x;
                    flag = true;
                }
            }
            if (flag == false)
                return;
        }
        else{
            for (int j = n - 1; j > i;j--){
                if(a[j-1] > a[j]){
                    x = a[j - 1];
                    a[j - 1] = a[j];
                    a[j] = x;
                    flag = true;
                }
            }
                if (flag == false)
                    return;
        }
    }
}

int main(){
    int a[7] = {4, 3, 2, 9, 8, 7, 6};
    BubbleSort(a, 7);
    for (int i = 0; i < 7;i++){
        printf("%d ", a[i]);
    }
}

试题2(王道8.3.3节综合练习3):

已知线性表按顺序存储,且每个元素都是不相同的整数类型元素,设计把所有奇数移动到所有偶数前边的算法(要求时间最少,辅助空间最少)。

本题可使用类似快排的思想:

#define ElemType int
void oddbeforeeven(ElemType a[],int n){
    int low = 0;
    int high = n - 1;
    int change;
    while(low < high){
        while(a[low] % 2 != 0){  //前面是奇数
            low = low + 1;
        }
        while(a[high] % 2 == 0){  //后面是偶数
            high = high - 1;
        }
        change = a[high];
        a[high] = a[low];
        a[low] = change;
        low = low + 1;  //注意后面必须在移动一下指针
        high = high - 1;
    }
}

int main(){
    int a[7] = {4, 3, 2, 9, 8, 7, 6};
    oddbeforeeven(a, 7);
    for (int i = 0; i < 7;i++){
        printf("%d ", a[i]);
    }
}

输出:

7 3 9 2 8 4 6

试题3(王道8.3.3节综合练习5):

试编写一个算法,在数组中找到第k小的元素。

此题可参考王道第七章的二叉排序树的练习(王道7.3.4节综合练习11):

【试题再现】编写一个递归算法,在一棵具有n个结点的二叉排序树上查找第k小的元素,并返回该结点的指针。要求算法的平均时间复杂度是,二叉排序树每个结点中除了data,lchild,rchild外,增设一个count成员,保存以该结点为根的子树的结点个数。

我们首先实现一下快速排序:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define ElemType int
int Partition(ElemType a[],int low,int high){
    ElemType pivot = a[low];
    while(low < high){
        while(low<high&&a[high]>=pivot)
            high = high - 1;
        a[low] = a[high];
        while(low<high&&a[low]<=pivot)
            low = low + 1;
        a[high] = a[low];
    }
    a[low] = pivot;
    return low;
}
void QuickSort(ElemType a[],int low,int high){
    if(low<high){
        int pivotpos = Partition(a, low, high);
        QuickSort(a, low, pivotpos - 1);
        QuickSort(a, pivotpos + 1, high);
    }
}

int main(){
    int a[7] = {4, 3, 2, 9, 8, 7, 6};
    QuickSort(a, 0, 6);
    for (int i = 0; i < 7;i++){
        printf("%d ", a[i]);
    }
}

当快速排序结果出来后依次输出可以直接得到答案。这里也可以递归:

#define ElemType int
int Partition(ElemType a[],int low,int high){
    ElemType pivot = a[low];
    while(low < high){
        while(low < high && a[high] >= pivot)
            high = high - 1;
        a[low] = a[high];
        while(low < high && a[low] <= pivot)
            low = low + 1;
        a[high] = a[low];
    }
    a[low] = pivot;
    return low;  //返回pivot的下标
}

int QuickSortk(ElemType a[],int low,int high,int k){
    int pivotpos = Partition(a, low, high);
    if(pivotpos == k-1){
        printf("%d\n", a[pivotpos]);
        return a[pivotpos];
    }
    else if(pivotpos > k-1){
        return QuickSortk(a, low, pivotpos - 1, k);
    }
    else{
        return QuickSortk(a, pivotpos + 1, high, k);
    }
}

int main(){
    int a[10] = {4, 3, 2, 9, 8, 7, 6, 10, 14, 17};
    QuickSortk(a, 0, 9, 6);
    for (int i = 0; i < 10;i++){
        printf("%d ", a[i]);
    }
}

输出:

8
2 3 4 6 7 8 9 10 14 17

试题4(王道8.3.3节综合练习6):

荷兰国旗问题。

分类讨论,这题可能不是那么好想,一点点调吧...

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define ElemType int
int NetherlandsFlag(ElemType a[],int n){
    int red = -1;
    int blue = n;
    int x;
    for (int i = 0; i < n;i++){
        if(i < blue){
            if(a[i] == 0){  //i之前全部是红或白
                x = a[i];
                a[i] = a[red + 1];
                a[red + 1] = x;
                red = red + 1;
            }
            else if(a[i] == 2){
                while(a[blue - 1] == 2){
                    blue = blue - 1;
                }
                if(i < blue){
                    x = a[i];
                    a[i] = a[blue - 1];
                    a[blue - 1] = x;
                    blue = blue - 1;
                    if(a[i] == 0){  //红色的交换到前面
                        x = a[i];
                        a[i] = a[red + 1];
                        a[red + 1] = x;
                        red = red + 1;
                    }
                }
            }
        }
        else
            break;
    }
}

int main(){
    int a[11] = {2, 1, 0, 0, 2, 1, 1, 0, 0, 2, 1}; // 0,1,2代表红白蓝
    NetherlandsFlag(a, 11);
    for (int i = 0; i < 11;i++){
        printf("%d ", a[i]);
    }
}

输出:

0 0 0 0 1 1 1 1 2 2 2 

试题5(王道8.3.3节综合练习7):

解答:把试题3的代码参数k换成\left \lfloor n/2 \right \rfloor即可。

试题6(王道8.6.3节综合练习2):

设顺序表用数组A[ ]表示,表中元素存储在数组下标1到m+n范围内,前m个元素递增有序,后n个元素也递增有序,设计算法使得整个顺序表有序。

可以看成直接插入排序进行了m轮,然后在进行n轮直接插入排序:

#define ElemType int
int Sort(ElemType a[],int m,int n){
    int i,k;
    for (int i = m + 1; i <= m + n;i++){
        a[0] = a[i];  //复制到a[0]
        for (k = i - 1; a[k] > a[0]; k--){ // 移动
            a[k + 1] = a[k];
        }
        a[k + 1] = a[0];
    }
}

int main(){
    int a[9] = {0,2,4,5,7,3,5,9,11}; 
    Sort(a, 4, 4);
    for (int i = 1; i <= 8;i++){
        printf("%d ", a[i]);
    }
}

输出:

2 3 4 5 5 7 9 11

试题7(王道8.6.3节综合练习3):

有一种简单的排序算法,叫做计数排序。这种排序算法对一个待排序的表进行排序,并将排序结果存放在另一个新的表中。必须注意的是,表中所有待排序的关键字互不相同。计数排序算法针对表中的每一个记录,遍历待排序的表一遍,统计表中有多少个记录的关键字比该记录的关键字小。假如针对某一个记录,统计出计数值为c,那么,这个记录在新的有序表中合适的存放位置即为c。设计实现计数排序的算法。

#define ElemType int
int Sort(ElemType a[],ElemType b[]){
    int count = 0;
    for (int i = 0; i < 10;i++){
        count = 0;
        for (int j = 0; j < 10;j++){
            if(a[j]<a[i])
                count++;
        }
        b[count] = a[i];
    }
}

int main(){
    int a[10] = {0,4,3,2,6,9,8,11,32,21}; 
    int b[10];
    Sort(a, b);
    for (int i = 0; i <= 9;i++){
        printf("%d ", b[i]);
    }
}

试题8(王道8.6.3节综合练习4):

设有一个数组的存放一个无序关键序列K_1,K_2...K_n,现在要求把最后一个元素K_n放在将元素排序后的正确位置上,试编写实现该功能的算法,要求比较关键字的次数不超过n。

可以用上题的思路,也可借助快速排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1155646.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FIFO 位宽转换

从8位转32位 module tb_fifo();reg clk,rst; initial beginclk0;forever #4.545 clk~clk; end initial beginrst1;#9.09 rst0; endreg [31:0] cnts; always (posedge clk or posedge rst) beginif(rst)begincnts < 32d0;endelsebegincnts < cnts 1b1;end endreg […

美国白宫发布总统令:鼓励AI以安全、可靠的方式发展

美国华盛顿时间10月30日&#xff0c;美国白宫官网发布了&#xff0c;关于发展安全、可靠和值得信赖的AI&#xff08;人工智能&#xff09;的拜登总统行政令。 白宫表示&#xff0c;该行政令为AI安全和保障制定了新标准&#xff0c;保护了用户的数据隐私&#xff0c;促进公平和…

英语——歌曲篇——only you

《only you》(只有你)赏析 很多人都听过The Platters(派特斯乐队)演唱的《only you》(只有你)这首歌曲&#xff0c;尤其是看过在周星驰和罗家英在《大话西游》里面演绎的"无厘头"版本后。 不过&#xff0c;又有几人知道&#xff0c;这首歌曲原来是经典浪漫影片《罗马…

C语言_常用数据类型地址的理解

常用基本数据类型&#xff1a; #include <stdio.h> #include <stdlib.h> #include <stdint.h>int main(){printf("基本数据类型:\n");printf("char: %d\n", sizeof(char));printf("int: %d\n", sizeof(int));printf("do…

1.6 基本安全设计准则

思维导图&#xff1a; 1.6 基本安全设计准则笔记 目标&#xff1a;理解和遵循一套广泛认可的安全设计准则&#xff0c;以指导保护机制的开发。 主要准则&#xff1a; 机制的经济性&#xff1a;安全机制应设计得简单、短小&#xff0c;便于测试和验证&#xff0c;减少漏洞和降…

linux系统的环境变量-搞清环境变量到底是什么

环境变量 引例环境变量常见的环境变量echoexportenvunsetset 通过代码获取环境变量使用第三个参数获取使用全局变量enviorn获取环境变量通过系统调用获取环境变量 环境变量具有全局属性main函数前两个参数的作用 引例 在linux系统中&#xff0c;我们使用ls命令&#xff0c;直接…

Python 算法高级篇:深度优先搜索和广度优先搜索的高级应用

Python 算法高级篇&#xff1a;深度优先搜索和广度优先搜索的高级应用 引言 1. 深度优先搜索&#xff08; DFS &#xff09;回顾2. 广度优先搜索&#xff08; BFS &#xff09;回顾3. 拓扑排序4. 连通性检测5. 最短路径问题6. 案例分析&#xff1a;社交网络分析7. 总结 引言 深…

剑指 Offer || 084.全排列||

题目 给定一个可包含重复数字的整数集合 nums &#xff0c;按任意顺序 返回它所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1…

【蓝桥杯选拔赛真题07】C++小球自由落体 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

目录 C/C++小球自由落体 一、题目要求 1、编程实现 2、输入输出 二、算法分析

PostgreSQL在云端:部署、管理和扩展你的数据库

随着云计算技术的迅猛发展&#xff0c;将数据库迁移到云端已经成为许多企业的首选。而在众多数据库管理系统中&#xff0c;PostgreSQL因其稳定性、灵活性和可扩展性而成为了不少企业的首选之一。 部署PostgreSQL在云端 将PostgreSQL部署在云端是一个相对简单的过程。云服务提供…

IMX6ULL——GPIO

本章目的&#xff1a;使用GPIO点亮一个LED灯 1.LED原理 &#xff08;1&#xff09;LED类型&#xff1a;插脚LED&#xff1b;贴片LED。 &#xff08;2&#xff09;LED点亮电路 法一&#xff1a; 法二&#xff1a; 我们本章使用法二&#xff0c;使用IMX6ULL的GPIO引脚输出高低电…

Java架构师软件架构的演化和维护

目录 1 导学2 软件架构演化和定义3 面向对象软件架构演化4 软件架构演化方式的分类5 软件架构演化原则6 软件架构演化评估方法7 大型网站架构演化8 软件架构维护想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导学 2 软件架构演化和定义 软件架构的演化和维护就是对…

2023-2024-1高级语言程序设计第1次月考

7-1-1 计算摄氏温度 给定一个华氏温度F&#xff0c;本题要求编写程序&#xff0c;计算对应的摄氏温度C。计算公式&#xff1a;C5(F−32)/9。题目保证输入与输出均在整型范围内。 输入格式: 输入在一行中给出一个华氏温度。 输出格式: 在一行中按照格式“Celsius C”输出对…

软考系统架构师案例分析知识点整理

系统规划&#xff1a;包括系统项目的提出预可行性分析&#xff1b;系统方案的制定、评价和改进&#xff1b;新旧系统的分析和比较&#xff1b;现有软件、硬件和数据资源的有效利用&#xff1b; 软件架构设计&#xff1a;XML技术&#xff1b;基于架构的软件开发过程&#xff1b;…

【算法通关村第一关】链表经典问题

1.两个链表第一个公共子节点 1.这是一道经典的链表问题&#xff1a;输入两条链表&#xff0c;找出他们的第一个公共节点。 使用集合的方法&#xff1a; public ListNode findFirstCommonNodeBySet(ListNode headA,ListNode headB){Set<ListNode> set new HashSet<&g…

Linux服务器部署带Cplex的Java项目

Linux版Cplex安装 Cplex安装包 Cplex 22.1.0 Linux安装包 安装步骤 找到安装包的路径 [roothecs-327697 ~]# cd /www/cplex [roothecs-327697 cplex]# ls cplex_studio2210.linux_x86_64.bin使用chmod 777赋予安装包读、写、执行权限&#xff0c;使用./执行安装 [roothec…

数字IC前端学习笔记:数字乘法器的优化设计(基4布斯编码华莱士树乘法器)

相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 使用基2布斯乘法器虽然能减少乘数中0的数量&#xff0c;但最终还是无法减少部分积的数量&#xff0c;因此一种更合理的编码方式产生了——基4布斯编码。它可以将部…

LeetCode刷题---简单组(六)

文章目录 &#x1f352;题目一 69. x 的平方根&#x1f352;解法一&#x1f352;解法二&#x1f352;题目二 70. 爬楼梯&#x1f352;解法一 &#x1f352;题目一 69. x 的平方根 &#x1f352;解法一 class Solution(object):def mySqrt(self, x):""":type x:…

皮肤渲染方法总结

一、皮肤次表面光照 HDRP用的延迟管线&#xff0c;镜面和散射分开进行计算 UE有透射开启和关闭的效果 &#xff08;一&#xff09;镜面反射 BRDF和Kelemen方法 &#xff08;二&#xff09;次表面散射与透射 1.散射&#xff1a;BRDF与BRSSDF&#xff08;从反射点附近的点进行…

基于springboot框架的房屋租赁租房系统

功能如图所示 摘要 房屋租赁租房系统是一个基于Spring Boot框架开发的全新房地产管理平台&#xff0c;它旨在简化租房流程&#xff0c;提供房东和租户之间的高效互动&#xff0c;以满足现代社会对房屋租赁的不断增长的需求。该系统充分利用了Spring Boot的强大特性&#xff0c;…