(PS:直接拿的友友zy的)
一个不知名大学生,江湖人称菜狗
original author: jacky Li
Email : 3435673055@qq.com
Time of completion:2023.1.1
Last edited: 2023.1.1
目录
(PS:直接拿的友友zy的)
双向链表的双向冒泡排序
第1关:双向链表双向冒泡排序
任务描述
相关知识
编程要求
测试说明
参考代码
红白蓝砾石排序
第1关:红白蓝砾石排序
任务描述
相关知识
编程要求
测试说明
参考代码
算法设计4-5
第1关:调整负值
任务描述
相关知识
编程要求
测试说明
参考代码
第2关:快排查找
任务描述
相关知识
编程要求
测试说明
参考代码
作者有言
双向链表的双向冒泡排序
第1关:双向链表双向冒泡排序
任务描述
本关任务:有n个记录存储在带头结点的双向链表中,现用双向冒泡排序法对其按上升序进行排序,请写出这种排序的算法。(注:双向冒泡排序即相邻两趟排序向相反方向冒泡)。
相关知识
为了完成本关任务,你需要掌握:双向冒泡排序算法的思想。
编程要求
根据提示,在右侧编辑器补充代码
测试说明
平台会对你编写的代码进行测试:
参考代码
#include <iostream>
using namespace std;
# define OK 1;
typedef int ElemType;
typedef struct node
{
ElemType data;
struct node *prior,*next;
}node,*LinkList;
void CreateDlink(LinkList &L)
{
int i,n;
LinkList rear,p;
L=new node;
L->next=NULL;
rear=L;
cin>>n;
for(i=1;i<=n;i++)
{
p=new node;
cin>>p->data;
p->next=NULL;
rear->next=p;
p->prior=rear;
rear=p;
}
}
void TwoWayBubbleSort(LinkList L)
//对存储在带头结点的双向链表la中的元素进行双向起泡排序。
{
//###### Begin ######
int exchange = 1;//设标记
LinkList head = L;//双向链表头,算法过程中是向下起泡的开始结点
LinkList tail = NULL;//双向链表尾,算法过程中是向上起泡的开始结点
while(exchange)
{
LinkList p = head->next;
exchange = 0;
while (p->next != tail)
{
if (p->data > p->next->data)
{
LinkList temp = p->next; exchange = 1;
p->next = temp->next;
if(temp->next)temp->next->prior = p;
temp->next = p; p->prior->next = temp;
temp->prior = p->prior; p->prior = temp;
}
else p = p->next;
}
tail = p;
p = tail->prior;
while (exchange&&p->prior != head)
{
if (p->data < p->prior->data)
{
LinkList temp = p->prior; exchange = 1;
p->prior = temp->prior; temp->prior->next = p;
temp->prior = p; p->next->prior = temp;
temp->next = p->next; p->next = temp;
}
else p = p->prior;
}
head = p;
}
// ###### End ######
} //算法结束
void DlinkOut(LinkList &L)
{
LinkList p;
p=L->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
int main()
{
LinkList L;
CreateDlink(L);
TwoWayBubbleSort(L);
DlinkOut(L);
return 0;
}
红白蓝砾石排序
第1关:红白蓝砾石排序
任务描述
本关任务:设有顺序放置的n个桶,每个桶中装有一粒砾石,每粒砾石的颜色是红,白,蓝之一。要求重新安排这些砾石,使得所有红色砾石在前,所有白色砾石居中,所有蓝色砾石居后,重新安排时对每粒砾石的颜色只能看一次,并且只允许交换操作来调整砾石的位置。
相关知识
为了完成本关任务,你需要掌握:排序算法的思想。
编程要求
根据提示,在右侧编辑器补充代码
测试说明
平台会对你编写的代码进行测试:
参考代码
#include <iostream>
using namespace std;
# define MAXSIZE 20 //设记录不超过20个
# define OK 1;
typedef char rectype;
typedef struct { //定义顺序表的结构
rectype r[MAXSIZE+1]; //存储顺序表的向量 r[0]一般作哨兵或缓冲区
int length ; //顺序表的长度
}SqList;
void Input(rectype r[],int n)
{
int i;
for(i=1;i<=n;i++)
{
cin>>r[i];
}
}
void Output(rectype r[],int n)
{
int i;
for(i=1;i<=n;i++)
cout<<r[i]<<" ";
cout<<endl;
}
void QkSort(rectype r[],int n)
// r为含有n个元素的线性表,元素是具有红、白和兰色的砾石,用顺序存储结构存储,
//本算法对其排序,使所有红色砾石A在前,白色B居中,兰色C在最后。
{
//###### Begin ######
int a=0,b=0,c=0;
for(int i=1;i<=n;i++)
{
if(r[i]=='A') a++;
else if(r[i]=='B') b++;
else c++;
}
for(int i=1;i<=a;i++)
r[i]='A';
for(int i=a+1;i<a+1+b;i++)
r[i]='B';
for(int i=a+1+b;i<a+1+b+c;i++)
r[i]='C';
// ###### End ######
}//结束QkSor算法
int main()
{
SqList L;
int n;
cin>>n;
Input(L.r,n);
QkSort(L.r,n);
Output(L.r,n);
}
算法设计4-5
第1关:调整负值
任务描述
本关任务:编写算法,对n个关键字取整数值的记录序列进行整理,以使所有关键字为负值的记录排在关键字为非负值的记录之前,要求: ① 采用顺序存储结构,至多使用一个记录的辅助存储空间; ② 算法的时间复杂度为O(n)。
相关知识
为了完成本关任务,你需要掌握:排序算法的思想。
编程要求
根据提示,在右侧编辑器补充代码
测试说明
平台会对你编写的代码进行测试:
参考代码
#include <iostream>
using namespace std;
# define MAXSIZE 20 //设记录不超过20个
typedef struct { //定义顺序表的结构
int r[MAXSIZE+1]; //存储顺序表的向量 r[0]一般作哨兵或缓冲区
int length ; //顺序表的长度
}SqList;
int ListCreate(SqList &L)
{
int i=1,n;
cin>>n;
while(i<=n)
{
cin>>L.r[i];
i++;
}
L.length=n;
}
void process(SqList &L)
{
//###### Begin ######
int i=1 , j=L.length;
while(i<j)
{
while(L.r[i]<0) i++;
while(L.r[j]>0) j--;
if(i<=j)
swap(L.r[i],L.r[j]);
}
// ###### End ######
}
void ListOut(SqList L)
{
int i;
for(i=1;i<=L.length;i++)
cout<<L.r[i]<<" ";
cout<<endl;
}
int main()
{
SqList L;
ListCreate(L);
process( L );
ListOut(L);
return 0;
}
第2关:快排查找
任务描述
本关任务:借助于快速排序的算法思想,在一组无序的记录中查找给定关键字值等于key的记录。设此组记录存放于数组r[l..n]中。若查找成功,则输出该记录在r数组中的位置及其值,否则显示“not find”信息。请简要说明算法思想并编写算法。 [题目分析]把待查记录看作枢轴,先由后向前依次比较,若小于枢轴,则从前向后,直到查找成功返回其位置或失败返回0为止。
相关知识
为了完成本关任务,你需要掌握:快速排序算法的思想。
编程要求
根据提示,在右侧编辑器补充代码
测试说明
平台会对你编写的代码进行测试:
参考代码
#include <iostream>
using namespace std;
# define MAXSIZE 20 //设记录不超过20个
# define OK 1;
typedef int datatype;
typedef struct
{
datatype key;
}RecType;
typedef struct { //定义顺序表的结构
RecType r[MAXSIZE+1]; //存储顺序表的向量 r[0]一般作哨兵或缓冲区
int length ; //顺序表的长度
}SqList;
void ListCreate(SqList &L)
{
int i=1,n;
cin>>n;
while(i<=n)
{
cin>>L.r[i].key;
i++;
}
L.length=n;
}
int index (RecType R[],int low,int high,datatype key) //key为待查关键字
{
//###### Begin ######
for(int i=low;i<=high;i++)
{
if(key == R[i].key)
return i;
}
puts("Not find");
return 0;
// ###### End ######
}//index
int main()
{
SqList L;
datatype key;
int loc;
ListCreate(L);
cin>>key;
loc=index(L.r,1,L.length,key); //loc是关键字所在位置
cout<<loc<<endl;
}
作者有言
如果感觉博主讲的对您有用,请点个关注支持一下吧,将会对此类问题持续更新……