数据结构实验4(排序算法的实现及性能分析)

苏州大学数据结构课程实践 实验6:排序算法的实现及性能测试及比较 在书中,各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。试通过具体数据比较各种算法的关键字比较次数和记录移动次数,以取得直观感受。要求:(1)编写程序创建一些整数文件用于排序。创建的这些文件可以根据需要生成不同的长度,如长度分别为20,200和2000,以正序、逆序、随机顺序的方式创建这些文件,通过把所有这些测试数据保存在文件中(而不是每次在测试程序时用随机数生成),可以使用同样的数据去测试不同的方法,因此会更易于比较这些方法的性能。 阅读详情

实现了选择排序, 插入排序, 冒泡排序, 快速排序, 改进后的快速排序, 以及两路合并排序.

通过随机函数随机生成100个数, 进行各种排序, 记录排序开始时间以及结束时间, 计算消耗的时间来比较算法的优略.

实现代码:

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "queue"
#include "stack"
#include "cmath"
#include "utility"
#include "map"
#include "set"
#include "vector"
#include "list"
#include "string"
#include "cstdlib"
#include "ctime"
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int MAXN = 1005;
template <class T>
void SelectSort(T A[], int n)
{
	int small;
	for(int i = 0 ; i < n; ++i) {
		small = i;
		for(int j = i + 1; j < n; ++j)
			if(A[j] < A[small]) small = j;
		swap(A[i], A[small]);
	}
}
template <class T>
void InsertSort(T A[], int n)
{
	for(int i = 1; i < n; ++i) {
		int j = i;
		T tmp = A[j];
		while(j > 0 && tmp < A[j - 1]) {
			A[j] = A[j - 1];
			j--;
		}
		A[j] = tmp;
	}
}
template <class T>
void BubbleSort(T A[], int n)
{
	int i = n - 1, j, last;
	while(i > 0) {
		last = 0;
		for(int j = 0; j < i; ++j)
			if(A[j + 1] < A[j]) {
				swap(A[j], A[j + 1]);
				last = j;
			}
		i = last;
	}
}
template <class T>
void QSort(T A[], int left, int right)
{
	int i, j;
	if(left < right) {
		i = left, j = right + 1;
		do {
			do i++; while(A[i] < A[left]);
			do j--; while(A[j] > A[left]);
			if(i < j) swap(A[i], A[j]);
		}while(i < j);
		swap(A[left], A[j]);
		QSort(A, left, j - 1);
		QSort(A, j + 1, right);
	}
}
template <class T>
void QuickSort(T A[], int n)
{
	QSort(A, 0, n - 1);
}
template <class T>
void MagicQSort(T A[], int left, int right)
{
	int i, j;
	if(right >= 9) {
		if(left < right) {
			i = left, j = right + 1;
			do {
				do i++; while(A[i] < A[left]);
				do j--; while(A[j] > A[left]);
				if(i < j) swap(A[i], A[j]);
			}while(i < j);
			swap(A[left], A[j]);
			MagicQSort(A, left, j - 1);
			MagicQSort(A, j + 1, right);
		}
	}
	else {
		InsertSort(A, right - left + 1);
		return;
	}
}
template <class T>
void MagicQuickSort(T A[], int n)
{
	MagicQSort(A, 0, n - 1);
}
template <class T>
void Merge(T A[], int i1, int j1, int i2, int j2)
{
	T *tmp = new T[j2 - i1 + 1];
	int i = i1, j = i2, k = 0;
	while(i <= j1 && j <= j2) {
		if(A[i] <= A[j]) tmp[k++] = A[i++];
		else tmp[k++] = A[j++];
	}
	while(i <= j1) tmp[k++] = A[i++];
	while(j <= j2) tmp[k++] = A[j++];
	for(int i = 0; i < k; ++i)
		A[i1++] = tmp[i];
	delete []tmp;
}
template <class T>
void MergeSort(T A[], int n)
{
	int i1, j1, i2, j2, size = 1;
	while(size < 1) {
		i2 = i1 + size;
		j1 = i2 - 1;
		if(i2 + size - 1 > n - 1) j2 = n - 1;
		else j2 = i2 + size - 1;
		Merge(A, i1, j1, i2, j2);
		i1 = j2 + 1;
	}
	size *= 2;
}
int main(int argc, char const *argv[])
{
	clock_t start, finish;
	srand(time(NULL));  
	int n = 100, i;
	int *a = new int[n];
	int *b = new int[n];
	int *c = new int[n];
	int *d = new int[n];
	int *e = new int[n];
	int *f = new int[n];
	cout  <<  "待排序序列为:"  <<  endl;
	for(int i = 0; i < n; ++i)
	{
		a[i] = rand()%91;
		cout  <<  a[i]  <<  " ";
		b[i] = a[i];
		c[i] = a[i];
		d[i] = a[i];
		e[i] = a[i];
		f[i] = a[i];
	}
	cout  <<  endl;
	start = clock();	
	SelectSort(a, n);
	cout  <<  "经过简单选择排序后的序列为:"  <<  endl;
    for(i = 0; i < n; ++i)
		cout  <<  a[i]  <<  " ";
	cout  <<  endl;
	finish = clock();
	cout  <<  "开始时间为:" << start << "	" << "结束时间为:" << finish << "   " << "持续时间为:" << (double)(finish - start)/ CLOCKS_PER_SEC << endl;
	start = clock();
	InsertSort(b, n);
	cout << "经过直接插入排序后的序列为:" << endl;
	for(i = 0; i < n; ++i)
		cout << b[i] << " ";
	cout << endl;
	finish = clock();
	cout << "开始时间为:" << start << "	" << "结束时间为:" << finish << "   " << "持续时间为:" << (double)(finish - start)/ CLOCKS_PER_SEC << endl;
	start = clock();
	BubbleSort(c, n);
	cout << "经过冒泡排序后的序列为:" << endl;
	for(i = 0; i < n; ++i)
		cout << c[i] << " ";
	cout << endl;
	finish = clock();
	cout << "开始时间为:" << start << "	" << "结束时间为:" << finish << "   " << "持续时间为:" << (double)(finish - start)/ CLOCKS_PER_SEC << endl;
	start = clock();
	QuickSort(d, n);
	cout << "经过快速排序后的序列为:" << endl;
	for(i = 0; i < n; i++)
		cout << d[i] << " ";
	cout << endl;
	finish = clock();
	cout << "开始时间为:" << start << "	" << "结束时间为:" << finish << "   " << "持续时间为:" << (double)(finish - start)/ CLOCKS_PER_SEC << endl;
	start = clock();
	MergeSort(e, n);
	cout << "经过两路合并排序后的序列为:" << endl;
	for(i = 0; i < n; i++)
		cout << e[i] << " ";
	cout << endl;
	finish = clock();
	cout << "开始时间为:" << start << "	" << "结束时间为:" << finish << "   " << "持续时间为:" << (double)(finish - start)/ CLOCKS_PER_SEC << endl;
	start = clock();
	MagicQuickSort(f, n);
	cout << "经过改进后的快速排序后的序列为:" << endl;
	for(i = 0; i < n; ++i)
		cout << f[i] << " ";
	cout << endl;
	finish = clock();
	cout << "开始时间为:" << start << "	" << "结束时间为:" << finish << "   " << "持续时间为:" << (double)(finish - start)/ CLOCKS_PER_SEC << endl;
	return 0;
}


数据结构实验:内部排序算法的性能分析 文章目录前言一、问题描述二、问题分析三、实验结果及分析(1)实验数据描述(2)实验结果(3)性能分析四、源代码 前言 记录下本学期的数据结构实验 本实验主要集中于比较几种内部排序算法 提示:以下是本篇文章正文内容,下面案例可供参考 一、问题描述 设计一个程序,对各种内部排序算法的关键字比较次数和移动次数进行比较。具体要求如下: ⑴ 编程实现内部排序算法:编程实现直接插入排序,希尔排序,冒泡排序,快速排序,简单选择排序,堆排序,归并排序算法。 ⑵ 要求数据规模:待排序数据类型不限(整型或浮点型),读取.. 阅读详情

相关推荐

数据结构-实验四 排序算法的实现

广州大学学生实验报告 开课实验室:计算机科学与工程实验(电子楼417)     2018年06月13日 学院 计算机科学与教育软件学院 年级、专业、班 网络161 姓名 卟咚君 学号 1606100*** 实验课程...

brandong 1万+

八大排序比较:冒泡排序,选择排序,插入排序,归并排序,快速排序,桶排序,基数排序的比较啊

排序算法实现与性能分析,评测: 编写程序,实现冒泡排序,简单选择排序,简单插入排序,归并排序,快速排序和其他各类排序方法,产生规模分别为100,1000,10000,100000,1000000的模拟数组,使用上述排序方法对同样的模拟数据进行排序,在验证排序结果正确性(编写排序结果验证函数)的同时,利用系统时间函数分别记录各排序开始时间和结束时间,计算各排序所需时间(若超过5分钟则记录,并在结果分析中标出)。再对已排序数据稍加次序调整,模拟几乎有序数组,再重复上述排序过程。给出评测结果表,总结,分析上述排序

kinano的博客 1527

数据结构实验四:查找和排序算法实现

一、实验目的 1、各种排序算法的实现 2、各种查找算法实现 二、使用仪器、器材 微机一台 操作系统:WinXP 编程软件:C++ 三、实验内容及原理 1、各种排序算法的实现 用随机函数生成16个2位正整数(10~99),实现插入排序、选择排序、冒泡排序、双向冒泡、快速排序、二路归并排序等多种排序算法,输出排序中间过程、统计关键字的比较次数和记录的移动次数。 2、各种查找算法实现 (1)顺序查找:使...

weixin_44014654的博客 5202

冒泡排序和简单选择排序的算法实现及优化

一.在排序算法中使用到的结构与函数 int arr[] = {50,60,90,10,30,40,20,70,80}; int len = sizeof(arr)/sizeof(arr[0]); //由于数组作为形参会退化为指针,所以在函数中计算不出数组的长度。 //因此数组的长度应在主函数中求出,并传入到函数当中以便使用。 函数 void swap(int *arr,int i,int j)...

乐行僧的博客 557

【数据结构】 实验报告13 各排序算法时间性能比较

目录一、实验目的和要求二、实验环境三、实验内容四、实验过程4.1 任务定义和问题分析4.2 数据结构的选择和概要设计五、测试及结果分析5.1 实验数据5.2 结果及分析六、实验收获八、附录(源代码) 一、实验目的和要求 目的:给出一组实验来比较排序算法的时间性能 要求: (1)时间性能 (2)实验数据应具有说服力 (3)实验结果要能以清晰的形式给出,如图、表等。 (4)算法所用时间必须是机器时间,也可以包括比较和交换元素的次数。 (5)实验分析及其结果要能以清晰的方式来描述,如数学公式或图表等。 (6)要给

RealCoder的博客 9751

实验报告——各种排序算法及性能分析

通过实际编码实现和对比不同算法的性能,我加深了对每种算法的理解,并学会了如何选择合适的排序算法来解决不同的问题。6.简单选择排序 (selectionSort 函数)选择排序算法是一种原址比较排序算法,它的工作原理是每次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。5.快速排序 (quickSort 函数和)快速排序是一种分而治之的排序算法,它通过选取一个枢纽元素,并围绕它重新排列序列,使得枢纽左侧的所有元素都不大于枢纽,右侧的所有元素都不小于枢纽。

m0_74912170的博客 1974

排序算法实现合集-经典排序算法实现与分析:冒泡排序,快速排序;直接插入排序,希尔排序;简单选择排序,堆排序;归并排序,基数排序;

针对排序算法,网上有比较好的讲解,参考自:程序员内功:八大排序算法和程序员的内功——数据结构和算法系列 这里主要是学习过程中的重新记录,记录典型的排序算法实现模板; 排序算法稳定性讲解: https://www.cnblogs.com/codingmylife/archive/2012/10/21/2732980.html https://blog.youkuaiyun.com/qq_43152052/article/details/100078825 排序的稳定性:首先,排序算法的稳定性大家应该都知...

ElegantHedgehog的博客 404

实验八 排序算法实验比较——数据结构

实验8排序算法实验比较 背景 排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。 假设含n个记录的序列为{ R1, R2, …,Rn} 其相应的关键字序列为{ K1, K2, …,Kn} 这些关键字相互之间可以进行比较,即在它们之间存在着这样一个关系:  Kp1≤Kp2≤…≤Kpn 按此固有关系将上式...

weixin_43123136的博客 2636

排序算法实现总结

一、快速排序 1) 实现一: 当将arr的第一个元素作为标准key, 需要从arr的尾端先做比较,这是因为作为标准的key,在函数partition的循环过程中一直在被移动,直到i == j的时候,key的值才固定。如果从arr首端开始比较,会出现错误; 此函数实现使用了swap函数; void swap(int* a, int* b) { int tmp = *a; *a = *b; *b = tmp; } int partition(int *arr, int i, int j) { int k

qq_25626505的博客 355

深入《数据结构》实验报告:C语言实现

线性表是一种常见的数据结构,它体现了数据元素之间一对一的关系。具体来说,线性表是一个数据元素的有限序列,这些元素之间除了第一个和最后一个外,其余的每个数据元素都有一个前驱和一个后继。线性表可以为空,也可以是有限的,且元素的个数称为线性表的长度。线性表的基本特征包括:- 同一性:线性表中的所有元素都是相同类型的。- 顺序性:线性表中的元素存在一个明确的顺序关系。- 有限性:线性表中的元素个数是有限的。栈是一种特殊的线性表,只允许在一端进行插入和删除操作。

weixin_26854475的博客 1217

数据结构-排序算法性能分析

【问题描述】 设计一个测试程序比较几种内部排序算法的关键字比较次数和移动次数以取得直观感受。 【基本要求】 (1)实现各种内部排序。包括冒泡排序,直接选择排序,希尔排序,快速排序,堆排序。 (2) 待排序的元素的关键字为整数。其中的数据要用随机数产生(如10000个),至少用5组不同的数据做比较,再使用各种算法对其进行排序,记录其排序时间,再汇总比较。 (3) 演示程序以人机对话的形式进行。每次测试完毕显示各种比较指标值的列表,比较各种排序的优劣。 (4) 界面友好,易与操作。采用菜单方式进行选择。

Java集合与数据结构——七大排序算法的实现

七大基本排序算法

rain67的博客 1万+

直接插入排序/快速排序/选择排序/冒泡排序(详细实现算法和性能比较)

数据结构---直接插入排序/快速排序/选择排序/冒泡排序(详细实现算法和性能比较)

数据结构内部排序算法的性能分析

【 昨天在整理资料的时候,刚好整理到数据结构的内部排序算法这一块,主要内容为对起泡排序、直接排序、简单选择排序、快速排序、希尔排序、堆排序算法进行比较,仅供初学数据结构的新手浏览学习,哪里写的不对的地方,请大神指点;之前学习内部排序算法的时候距离写这篇博客隔了挺长时间,有什么不好的地方,请评论,一定虚心改正】 简介: 本博客分为三部分: 第一部分:内部排序算法的性能分析问题描述及要求...

qq_42850073的博客 2533

SDM660电源部分配置:

SDM660电源部分配置: Panel power supplies 1、Reference power supplies Description Name Regulator Voltage (V) Panel power supply 0 vddio PMIC 660/L11 1.8 Panel power supply 1 Lab PMIC 660/lab 4.6 Panel power s...

weixin_41811215的博客 4729

一、Abaqus CAE 入门操作(薄膜应力计算)

一、Abaqus CAE 入门操作(薄膜应力计算)

A20802013的博客 4370

实验四 查找和排序算法实现

广州大学学生实验报告 开课实验室:计算机科学与工程实验(电子楼418A) 学院 计算机科学与网络工程学院 实验课程 数据结构实验 实验项目 实验四 查找和排序算法实现 一、实验目的: 1、各种排序算法的实现 2、各种查找算法实现 二、使用仪器、器材 微机一台 操作系统:WinXP 编程软件:C++ 三、实验内容及原理 1、各种排序算法的实现 用随机函数生成16个2位正整数(10~99),...

雨化于画 5795

全志T133-s3(Tina Linux)下RTL8723DS WiFi驱动移植与调试实战

本文详细介绍了在全志T133-s3平台(Tina Linux)上移植RTL8723DS WiFi驱动的完整流程,包括硬件连接、驱动源码获取、内核配置、系统适配、设备树配置以及常见问题排查。通过实战案例,帮助开发者快速解决SDIO接口通信、固件加载、电源管理等关键问题,实现稳定的WiFi功能。

weixin_30505225的博客 507

数据结构实验六 排序算法的实现

数据结构实验六 排序算法的实现(冒泡、选择、快速排序)。本篇内容为数据结构实验系列完结篇。

Code_流苏:在代码中寻诗意,在实践中觅真知 3132

无刷电机控制避坑指南:六步换向 vs FOC的5个关键差异

本文深入对比了无刷电机控制中六步换向与FOC(磁场定向控制)的五大核心差异。从控制逻辑、性能表现、效率能耗、硬件成本到应用场景,详细解析了FOC如何通过矢量合成实现平滑的正弦波控制与更高效率,而六步换向则以低成本实现简单开关驱动。旨在帮助工程师根据项目需求,在性能、成本与复杂度间做出最佳选择。

weixin_29216957的博客 510

osgEarth加载大疆数据

【代码】osgEarth加载大疆数据。

weixin_44769745的博客 308
上一篇: 拓扑排序的实现_TopoSort
下一篇: Codeforces Round #313 (Div. 2) 560C Gerald's Hexagon(脑洞)
GKHack
博客等级 码龄11年 48粉丝 291原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值