首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >优化冒泡排序 & 链表选择排序

优化冒泡排序 & 链表选择排序

作者头像
FishWang
发布2025-08-27 12:00:24
发布2025-08-27 12:00:24
2600
举报

代码如下:(未注释掉文件的读写函数)

代码语言:javascript
复制
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
#define CLR(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define LL long long
#define MAX 10000
int n;		//数据的个数
void Welcome()
{
	puts("*******************"); 
	puts("* 请输入排序方法:*");
	puts("* 1.冒泡排序      *");
	puts("* 2.链表选择排序  *");
	puts("*******************");
}

typedef struct LNode
{
	int num;		//数据域 
	struct LNode *next;		//指针域 
}LNode,*LinkList; 

void BubbleSortMethod(int *num)		//冒泡排序 
{
	printf ("请输入%d个数:\n",n);
	for (int i = 1 ; i <= n ; i++)
		scanf ("%d",&num[i]);
	//开始排序 
	int pos = n-1;		//最后进行交换的位置 
	while(pos != 1)
	{
		int t = 1;
		for (int j = 1 ; j <= pos ; j++)		//只需要交换到pos位置就行了 
		{
			if (num[j] > num[j+1])
			{
				swap(num[j],num[j+1]);		//交换
				t = j;
			}
		}
		pos = t;	//记录位置
	}
	//输出 
	printf ("排序完成,排序后的序列为:\n");
	for (int i = 1 ; i <=  n ; i++)
		printf ("%d%c",num[i],i == n ? '\n' : ' ');
}

void InitNode(LinkList &p)		//新建一个节点 
{
	p = (LNode *)malloc(sizeof(LNode));
	p->next = NULL;
}

void InputLinkList(LinkList L)
{
	LinkList p;
	for(int i = 1 ; i <= n ; i++)
	{
		InitNode(p);
		scanf ("%d",&p->num);
		L->next = p;
		L = L->next;
	}
} 

void LinkListDestroy(LinkList L)
{
	if (L == NULL)
		return;
	LinkListDestroy(L->next);
	free(L);
}

void SelectSort(LNode &head)
{
	printf ("请输入%d个数:\n",n);
	InputLinkList(&head);		//输入数据 
	//开始排序
	LinkList left,Min,pos;		//待交换节点、当前数据最小节点、滚动节点 
	left = Min = head.next;
	while(left->next != NULL)
	{
		pos = left;
		while (pos != NULL)		//滚动寻找最小数据 
		{
			if (Min->num > pos->num)
				Min = pos;
			pos = pos->next;
		}
		swap(left->num,Min->num);		//直接交换两者的数据域即可 
		left = Min = left->next;
	}
	//输出 
	printf ("排序完成,排序后的序列为:\n");
	left = head.next;
	while(left != NULL)
	{
		printf ("%d%c",left->num,left->next == NULL ? '\n' : ' ');
		left = left->next;
	}
	LinkListDestroy(head.next);		//清空链表 
}

int main()
{
	freopen("input.txt","r",stdin);
	freopen("MyOuput.txt","w",stdout);
	int num[MAX+4];
	LNode head;
	head.next = NULL;
	puts("请输入要排序的数的个数,输入0结束程序:");
	while (~scanf ("%d",&n) && n)
	{
		Welcome();
		int op;		//操作
		while (~scanf ("%d",&op))
		{
			if (op != 1 && op != 2)
				puts("输入有误,请重新输入:");
			else
				break;
		}
		if (op&1)
			BubbleSortMethod(num);
		else
			SelectSort(head);
		puts("");
		puts("请输入要排序的数的个数,输入0结束程序:");
	}
	puts("谢谢您的使用,按任意键退出程序!");
	system("pause");
	return 0;
}

生成测试数据:

代码语言:javascript
复制
#include <cstdio>
#include <stack>
#include <queue>
#include <cmath>
#include <vector>
#include <cstring>
#include <time.h>
#include <algorithm>
using namespace std;
#define CLR(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define LL long long
int main()
{
	freopen("input.txt","w",stdout);		//写出数据 
	int n;
	int u = 100;
	srand(unsigned(time(NULL)));
	while(u--)
	{
		n = (rand() % 100) + 10;
		printf ("%d 1 ",n);
		for (int i = 1 ; i <= n ; i++)
			printf ("%d ",rand());
		printf ("\n");
	}
	u = 100;
	while(u--)
	{
		n = (rand() % 100) + 10;
		printf ("%d 2 ",n);
		for (int i = 1 ; i <= n ; i++)
			printf ("%d ",rand());
		printf ("\n");
	}
	puts("0");
	return 0;
}

标准输出:

代码语言:javascript
复制
#include <cstdio>
#include <stack>
#include <queue>
#include <cmath>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
#define CLR(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define LL long long
int main()
{
	freopen("input.txt","r",stdin);
	freopen("StdOutput.txt","w",stdout);
	int n;
	int num[122];
	while (~scanf ("%d",&n) && n)
	{
		int t;
		scanf ("%d",&t);		//吸收排序方法的数字
		for (int i = 1 ; i <= n ; i++)
			scanf ("%d",&num[i]);
		sort(num+1,num+1+n);
		for(int i = 1 ; i <= n ; i++)
			printf ("%d ",num[i]);
		puts("");
	}
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档