当前位置: 首页 > news >正文

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

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

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

首先实现冒泡排序:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>#define ElemType intvoid 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 intvoid 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;}}}}elsebreak;}
}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。

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

相关文章:

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

试题1&#xff08;王道8.3.3节综合练习2&#xff09;&#xff1a; 编写双向冒泡排序算法&#xff0c;在正反两个方向交替扫描。即第一趟把关键字最大的元素放在序列的最后面&#xff0c;第二趟把关键字最小的元素放在序列最前面&#xff0c;如此反复。 首先实现冒泡排序&…...

python爬虫,如何在代理的IP被封后立刻换下一个IP继续任务?

前言 在实际的爬虫应用中&#xff0c;爬虫程序经常会通过代理服务器来进行网络访问&#xff0c;以避免访问过于频繁而受到网站服务器的限制。但是&#xff0c;代理服务器的IP地址也可能被目标网站限制&#xff0c;导致无法正常访问。这时候&#xff0c;我们需要在代理IP被封后…...

小程序开发——小程序项目的配置与生命周期

1.app.json配置属性 app.json配置属性 2.页面配置 app的页面配置指的是pages属性&#xff0c; pages数组的第一个页面将默认作为小程序的启动页。利用开发工具新建页面时&#xff0c;则pages属性对应的数组将自动添加该页面的路径&#xff0c;若是在硬盘中添加文件的形式则不…...

C语言之用指针交换两个数

1.指针存放是是地址&#xff0c;所以在用指针交换两个数的时候&#xff0c;需要对指针进行解引用(*p)。 用指针交换两个数&#xff0c;需要知道p1p2与*p1*p2。 p1p1是将p2的值赋值给p1. *p1*p2是将p2指针地址存放的值&#xff0c;赋值给p1指针地址存放的值&#xff0c;即p1地…...

Day 48 动态规划 part14

Day 48 动态规划 part14 解题理解1143103553 3道题目 1143. 最长公共子序列 1035. 不相交的线 53. 最大子数组和 解题理解 1143 设dp[i][j]为text10: i-1text20: j-1的最长公共子序列。 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> …...

目标检测与图像识别分类的区别?

目标检测与图像识别分类的区别 目标检测和图像识别分类是计算机视觉领域中两个重要的任务&#xff0c;它们在处理图像数据时有一些区别。 目标检测是指在图像中定位和识别多个目标的过程。其主要目标是确定图像中每个目标的边界框位置以及对应的类别标签。目标检测任务通常涉…...

群晖设置DDNS (服务商Godaddy被墙 DDNS-GO无法解析 采用自定义脚本方式完成DDNS更新)

起因&解决思路 事情的开始大概是这样的。。godaddy买了个域名&#xff0c;好好的用了半个月。。然后一直更新失败发现被狗东西墙了 在提一嘴DDNS-GO 解析失败原因 DDNS-GO必须要先向godaddy请求自己的IP地址[这里被墙卡住了]&#xff0c;然后比对&#xff0c;再决定是否上…...

博客摘录「 MySQL不区分大小写设置」2023年10月31日

操作系统的大小写是否敏感决定了数据库大小写是否敏感&#xff0c;而 Windows 系统是对大小写不敏感的&#xff0c;Linux 系统对大小写敏感。 mysql创建表时, 字符集需要设置"编码集(charset)"和"校验规则(collation)"。 编码集比较常用的有utf8和utf8mb4…...

【UE5】如何在UE5.1中创建级联粒子系统

1. 可以先新建一个actor蓝图&#xff0c;然后在该蓝图中添加一个“Cascade Particle System Component” 2. 在右侧的细节面板中&#xff0c;点击“模板”一项中的下拉框&#xff0c;然后点击“Cascade粒子系统&#xff08;旧版&#xff09;” 然后就可以选择在哪个路径下创建级…...

SpringCloud(五) Eureka与Nacos的区别

SpringCloud(二) Eureka注册中心的使用-CSDN博客 SpringCloud(四) Nacos注册中心-CSDN博客 在这两篇博文中我们详细讲解了Eureka和Nacos分别作为微服务的注册中心的使用方法和注意事项,但是两者之间也有一些区别. 一, Nacos实例分类 Nacos实例分为两种类型: 临时实例:如果实例…...

C语言 DAY07:预编译,宏,选择性编译,库(静态库,动态库)

声明与定义分离 声明&#xff1a;将声明单独封装成一个以.h为后缀名的头文件 定义&#xff1a;将定义的变量&#xff0c;函数&#xff0c;数组所在的源文件单独封装成一个.c文件。其实就是在源文件基础上将定义过的所有东西的声明分离出去就是了。 注意&#xff1a;1.声明的…...

[EFI]asus strix b760-i 13900F电脑 Hackintosh 黑苹果efi引导文件

硬件型号驱动情况主板 asus strix b760-i 处理器 I9 13900F 已驱动内存crucial ddr5-5200 64gb(32gb*2)(overclock 5600)已驱动硬盘 WD black sn850 500g*2 已驱动显卡rx570已驱动声卡Realtek ALCS1220A已驱动网卡Intel I225-V 2.5 Gigabit Ethernet已驱动无线网卡蓝牙Fevi T91…...

力扣383.赎金信

原题链接&#xff1a;383.赎金信 根据题意得出&#xff0c;需要判断第一个字符串内的字符有没有都在第二个字符串内出现(会有重复字符)&#xff0c;并且范围限制在26个英文小写字母 此时可以考虑用一个数组map 作哈希法映射操作 先将遍历第一个字符串&#xff0c;并让每个字符…...

CORS的原理以及在Node.js中的使用

在前端浏览器中的JavaScript代码发起HTTP请求到服务器的Node.js程序&#xff0c;CORS&#xff08;跨域资源共享&#xff09;会在以下几个步骤中发挥作用&#xff1a; 前端JavaScript代码发起请求&#xff1a; 前端浏览器中的JavaScript代码使用XMLHttpRequest对象或Fetch API等…...

kotlin实现单例模式

kotlin实现单例模式&#xff0c;大体分为两种方式&#xff0c;一种饿汉式单例模式&#xff0c;一种懒汉式单例模式。 1.饿汉式单例模式 在类前面加上object关键字&#xff0c;就实现了饿汉式单例模式&#xff1a; object singletonDemo { }在kotlin中&#xff0c;使用这种方式…...

【Java】LinkedList 集合

LinkedList集合特点 LinkedList 底层基于双向链表实现增删 效率非常高&#xff0c;查询效率非常低。 LinkedList源码解读分析 LinkedList 是双向链表实现的 ListLinkedList 是非线程安全的&#xff08;线程是不安全的&#xff09;LinkedList 元素允许为null,允许重复元素Linked…...

MySQL-Galera-Cluster集群详细介绍

目录 一、什么是Mysql集群&#xff1f;1.单节点mysql存在的常见问题2.mysql集群介绍3.Mysql集群的优点和风险 二、Mysql集群的一些疑问1.mysql的AB复制和Galera Cluster有什么区别&#xff1f;2.什么情况下适用AB复制&#xff0c;什么情况下使用Galera cluster&#xff1f;3.可…...

JavaScript从入门到精通系列第二十六篇:详解JavaScript中的Math对象

大神链接&#xff1a;作者有幸结识技术大神孙哥为好友&#xff0c;获益匪浅。现在把孙哥视频分享给大家。 孙哥连接&#xff1a;孙哥个人主页 作者简介&#xff1a;一个颜值99分&#xff0c;只比孙哥差一点的程序员 本专栏简介&#xff1a;话不多说&#xff0c;让我们一起干翻J…...

u盘直接拔出文件丢失怎么找回?u盘文件恢复办法分享!

u盘作为一种便捷的数据存储设备&#xff0c;被广泛地使用。通过u盘&#xff0c;我们可以在不同设备之间轻松传输文件&#xff0c;然而有时候&#xff0c;我们可能因为匆忙或疏忽并未安全弹出u盘&#xff0c;而是直接将u盘拔出&#xff0c;进而导致重要文件丢失&#xff0c;u盘直…...

rust学习-LinkedList

介绍 A doubly-linked list with owned nodes. 自有节点的双向链表 pub struct LinkedList<T, A = Global> whereA: Allocator, {/* private fields */ }使用 Vec 或 VecDeque 几乎总是更好,因为基于数组的容器通常更快、内存效率更高,并且可以更好地利用 CPU 缓存 …...

Audio2Face深度解析:音频驱动面部动画的技术架构与实战指南

Audio2Face深度解析&#xff1a;音频驱动面部动画的技术架构与实战指南 【免费下载链接】FACEGOOD-Audio2Face http://www.facegood.cc 项目地址: https://gitcode.com/gh_mirrors/fa/FACEGOOD-Audio2Face 在虚拟数字人快速发展的今天&#xff0c;如何让虚拟角色拥有自然…...

图解Linux内核DRM框架:从用户态ioctl到plane更新的完整数据流(以4.14版本为例)

图解Linux内核DRM框架&#xff1a;从用户态ioctl到plane更新的完整数据流&#xff08;以4.14版本为例&#xff09; 在图形显示技术领域&#xff0c;Linux内核的DRM&#xff08;Direct Rendering Manager&#xff09;框架扮演着核心角色。本文将聚焦于DRM_IOCTL_MODE_SETPLANE这…...

QwQ-32B+ollama实战案例:气象模型参数推理与极端天气归因分析

QwQ-32Bollama实战案例&#xff1a;气象模型参数推理与极端天气归因分析 1. 引言&#xff1a;当AI遇到气象科学 最近几年&#xff0c;极端天气事件越来越频繁&#xff0c;从罕见高温到突发暴雨&#xff0c;都给我们的生活带来了不小的影响。作为气象研究人员&#xff0c;我们…...

路沿模板,乐山水泥路面模板,40公分路面钢模哪里有名

打路面模板&#xff1a;乐山水泥路面的优质之选在道路建设中&#xff0c;打路面模板起着至关重要的作用。它不仅关系到路面的成型质量&#xff0c;还影响着整个工程的效率和成本。乐山地区对于道路建设的需求不断增加&#xff0c;尤其是在水泥路面的铺设方面&#xff0c;40公分…...

ViT图像分类-中文-日常物品完整指南:4090D单卡环境配置与中文类别映射说明

ViT图像分类-中文-日常物品完整指南&#xff1a;4090D单卡环境配置与中文类别映射说明 想试试用AI模型来识别你手机里的照片吗&#xff1f;比如&#xff0c;拍一张桌上的水杯、键盘或者零食&#xff0c;让模型告诉你它是什么。今天要介绍的这个工具&#xff0c;就能帮你轻松实…...

4个维度解析Lenovo Legion Toolkit:游戏本性能管理的轻量革命

4个维度解析Lenovo Legion Toolkit&#xff1a;游戏本性能管理的轻量革命 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit 1.…...

从AMP到cuFFT:半精度训练中非2的幂维度问题的深度解析与实战规避

1. 从报错信息看半精度训练中的cuFFT限制 最近在调试一个深度学习模型时&#xff0c;遇到了这样的报错&#xff1a;"RuntimeError: cuFFT only supports dimensions whose sizes are powers of two when computing in half precision"。这个错误看似简单&#xff0c…...

如何将 iQOO 手机备份到Mac

iQOO是vivo旗下的智能手机品牌&#xff0c;以其强劲的性能、出色的游戏体验和极具竞争力的价格而闻名。它深受那些希望以合理价格购买高性能Android手机的用户欢迎。然而&#xff0c;由于缺乏官方的 macOS 管理工具&#xff0c;许多用户发现将 iQOO 手机备份到Mac并非易事。幸运…...

SeargeSDXL:让SDXL图像生成像搭积木一样简单的ComfyUI终极方案

SeargeSDXL&#xff1a;让SDXL图像生成像搭积木一样简单的ComfyUI终极方案 【免费下载链接】SeargeSDXL Custom nodes and workflows for SDXL in ComfyUI 项目地址: https://gitcode.com/gh_mirrors/se/SeargeSDXL 还在为ComfyUI中复杂的SDXL工作流程而头疼吗&#xff…...

Z-Image-Turbo_Sugar脸部Lora模型服务运维指南:监控、日志与故障排查

Z-Image-Turbo_Sugar脸部Lora模型服务运维指南&#xff1a;监控、日志与故障排查 最近在帮一个做创意设计的朋友维护他们的AI图像生成服务&#xff0c;他们用的就是Z-Image-Turbo_Sugar这个专门生成特定风格人脸的Lora模型。朋友跟我吐槽&#xff0c;说服务时不时就“抽风”&a…...