双向链表的双向冒泡排序、红白蓝砾石排序、算法设计4-5

(PS:直接拿的友友zy的)

一个不知名大学生,江湖人称菜狗
original author: jacky Li
Email : [email protected]

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

作者有言

如果感觉博主讲的对您有用,请点个关注支持一下吧,将会对此类问题持续更新……

猜你喜欢

转载自blog.csdn.net/weixin_62075168/article/details/128513932