数据结构实验---排序

实验内容:

分别使用直接插入法排序、冒泡排序、选择排序方法,将用户随机输入的一列数按递增的顺序排列,并在其中一种排序算法中输出每趟排序的序列。

可以将其更改为c语言方式。

  1. Sort_A.cpp文件
    #define _CRT_SECURE_NO_WARNINGS 1
    
    #include <iostream>
    #include "Sort_A.h"
    
    using namespace std;
    
    //初始化顺序表L
    void InitSqList(SqList& L)
    {
    	cout << "输入顺序表长度:";
    	cin >> L.length;
    	for (int i = 0; i < MAXSIZE + 1; i++)		//将所有数组元素置初态为0
    	{
    		L.r[i].key = 0;
    		L.r[i].otherinfo = 0;
    	}
    	cout << "输入顺序表内容:";
    	for (int i = 1; i <= L.length; i++)			//给顺序表内依次输入数据
    		cin >> L.r[i].key;
    }
    
    //输出顺序表内容
    void OutSqList(SqList L)
    {
    	cout << "输出顺序表内容:";
    	for (int i = 1; i <= L.length; i++)			//依次输出顺序表内容
    		cout << L.r[i].key << "\t";
    	cout << endl;
    }
    
    //对顺序表L进行直接插入排序
    void InsertSort(SqList &L)
    {
    	int i, j, a, k = 1;
    	for (i = 2; i <= L.length; ++i)
    	{
    		if (L.r[i].key < L.r[i - 1].key)					//"<",需将r[i]插入有序子表
    		{
    			L.r[0] = L.r[i];								//将待插入的记录暂存到监视哨中
    			L.r[i] = L.r[i - 1];							//r[i-1]后移
    			for (j = i - 2; L.r[0].key < L.r[j].key; --j)	//从后向前寻找插入位置
    				L.r[j + 1] = L.r[j];						//记录逐个后移,直到找到插入位置
    			L.r[j + 1] = L.r[0];							//将r[0]即原r[i],插入正确位置
    		}
    
    		cout << "第" << k << "趟排序结果:";
    		for (a = 1; a <= k + 1; a++)						//输出每趟排序结果
    			cout << "\t" << L.r[a].key;
    		cout << endl;
    
    		a = 1;
    		k += 1;
    	}
    }
    
    //对顺序表L进行冒泡排序
    void BubbleSort(SqList &L)	
    {
    	int m, j, flag, a, k = 1;
    	RedType t;
    	m = L.length - 1;
    	flag = 1;									//flag用来标记某一趟排序是否发生交换
    	while ((m > 0) && (flag == 1))	
    	{
    		flag = 0;								//flag置0,如果本趟排序没有发生交换,则不会执行下一趟排序
    		for (j = 1; j <= m; j++)
    			if (L.r[j].key > L.r[j + 1].key)
    			{
    				flag = 1;						//flag置1,表示本趟排序发生了交换
    				t = L.r[j];
    				L.r[j] = L.r[j + 1];
    				L.r[j + 1] = t;					//交换前后两个记录
    			}
    		--m;
    
    		cout << "第" << k << "趟排序结果:";
    		for (a = 1; a <= L.length; a++)			//输出每趟排序结果
    			cout << "\t" << L.r[a].key;
    		cout << endl;
    
    		a = 1;
    		k += 1;
    	}
    }
    
    //对顺序表L进行简单选择排序
    void SelectSort(SqList &L)
    {
    	int i, k, j, a, b = 1;
    	RedType t;
    	for (i = 1; i < L.length; ++i)			//在L.r[i~L.length]中选择关键字最小的记录
    	{
    		k = i;
    		for (j = i + 1; j <= L.length; ++j)
    			if (L.r[j].key < L.r[k].key)
    				k = j;						//k指向此趟排序中关键字最小的记录
    		if (k != i)
    		{
    			t = L.r[i];
    			L.r[i] = L.r[k];
    			L.r[k] = t;						//交换r[i]与r[k]
    		}
    
    		cout << "第" << b << "趟排序结果:";
    		for (a = 1; a < b + 1; a++)			//输出每趟排序结果
    			cout << "\t" << L.r[a].key;
    		cout << endl;
    
    		a = 1;
    		b += 1;
    	}
    }

  2. Sort_A.h文件
    #pragma once
    #ifndef Sort_A_H
    #define Sort_A_H
    
    #define MAXSIZE	20			//顺序表的最大长度
    typedef int KeyType;		//定义关键字类型为整形
    typedef int InfoType;
    
    typedef struct {
    	KeyType	key;			//关键字项
    	InfoType otherinfo;		//其他数据项
    }RedType;					//记录类型
    
    typedef struct {
    	RedType r[MAXSIZE + 1];	//r[0]闲置或用做哨兵单元
    	int length;				//顺序表长度
    }SqList;					//顺序表类型
    
    void InitSqList(SqList& L);	//初始化顺序表L
    void OutSqList(SqList L);	//输出顺序表内容
    void InsertSort(SqList& L);	//对顺序表L进行直接插入排序
    void BubbleSort(SqList& L);	//对顺序表L进行冒泡排序
    void SelectSort(SqList& L);	//对顺序表L进行简单选择排序
    
    #endif
    

  3. main.cpp文件
    #define _CRT_SECURE_NO_WARNINGS 1
    
    #include <iostream>
    #include "Sort_A.h"
    
    using namespace std;
    
    int main()
    {
    	SqList L1, L2, L3;
    	InitSqList(L1);
    	L2 = L1;
    	L3 = L1;
    
    	cout << "-----------------直接插入法排序---------------------" << endl;
    	InsertSort(L1);
    	OutSqList(L1);
    	cout << endl;
    
    	cout << "--------------------冒泡排序------------------------" << endl;
    	BubbleSort(L2);
    	OutSqList(L2);
    	cout << endl;
    
    	cout << "--------------------选择排序-----------------------" << endl;
    	SelectSort(L3);
    	OutSqList(L3);
    	cout << endl;
    
    	return 0;
    }

    实验结果:

  • 31
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
二叉排序树(Binary Search Tree,简称BST)是一种特殊的二叉树,它具有以下性质: 1. 左子树上的所有节点的值都小于根节点的值。 2. 右子树上的所有节点的值都大于根节点的值。 3. 左右子树也分别为二叉排序树。 二叉排序树主要用于实现动态查找,可以高效地插入、删除和查找元素。下面是二叉排序树的实现步骤: 1. 建立二叉排序树: - 如果树为空,将新节点作为根节点。 - 如果树不为空,从根节点开始,比较新节点的值与当前节点的值的大小关系: - 如果新节点的值小于当前节点的值,将新节点插入到当前节点的左子树中。 - 如果新节点的值大于当前节点的值,将新节点插入到当前节点的右子树中。 - 如果新节点的值等于当前节点的值,不进行插入操作。 2. 遍历二叉排序树: - 前序遍历:先访问根节点,然后递归地遍历左子树和右子树。 - 中序遍历:先递归地遍历左子树,然后访问根节点,最后递归地遍历右子树。 - 后序遍历:先递归地遍历左子树和右子树,最后访问根节点。 3. 删除节点: - 如果要删除的节点是叶子节点,直接删除即可。 - 如果要删除的节点只有一个子节点,将子节点替换为要删除的节点。 - 如果要删除的节点有两个子节点,可以选择用其前驱节点或后继节点替换。 4. 查找并记录访问次数: - 从根节点开始,比较要查找的值与当前节点的值的大小关系: - 如果要查找的值小于当前节点的值,继续在左子树中查找。 - 如果要查找的值大于当前节点的值,继续在右子树中查找。 - 如果要查找的值等于当前节点的值,找到了目标节点,并记录访问次数。 5. 利用快速排序的思想将负数排在正数前: - 在建立二叉排序树时,可以将负数插入到左子树中,将正数插入到右子树中,这样就可以实现负数排在正数前的效果。 以下是一个二叉排序树的示例代码: ```cpp #include <iostream> struct TreeNode { int value; TreeNode* left; TreeNode* right; }; void insert(TreeNode*& root, int value) { if (root == nullptr) { root = new TreeNode; root->value = value; root->left = nullptr; root->right = nullptr; } else if (value < root->value) { insert(root->left, value); } else if (value > root->value) { insert(root->right, value); } } void inorderTraversal(TreeNode* root) { if (root != nullptr) { inorderTraversal(root->left); std::cout << root->value << " "; inorderTraversal(root->right); } } int main() { TreeNode* root = nullptr; // 插入节点 insert(root, 5); insert(root, 3); insert(root, 7); insert(root, 2); insert(root, 4); insert(root, 6); insert(root, 8); // 中序遍历 inorderTraversal(root); // 输出:2 3 4 5 6 7 8 return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慢慢丶丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值