数据结构实验---排序

实验内容:

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

可以将其更改为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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

慢慢丶丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值