八大排序算法源码 + 耗时长度比较

2023-05-16

八大排序算法的排序时间长度的比较,测试数据10000000时部分结果如下

输入测试数据长度: 10000000
数据初始化中...
数据初始化完成!
        堆排序用时:    8秒 499毫秒
      快速排序用时:   22秒  35毫秒
      归并排序用时:   34秒 473毫秒

另外五种排序本人并未等待结果,读者可自行测试

测试时请注意内存消耗,以免数据太大,内存不够,可自行测试单一算法以便增加可测试数据数目


#include <iostream>
#include <ctime>
#include <iomanip>

using namespace std;

int NUM;  //测试数据大小
const int SortFunNum = 8;

template <typename T> void BubleSort(T a[], int, int);
template <typename T> void SelectSort(T a[], int, int);
template <typename T> void InsertSort(T a[], int, int);
template <typename T> void RankSort(T a[], int, int);
template <typename T> void Merge(T a[], int, int , int);
template <typename T> void MergeSort(T a[], int, int);
template <typename T> int  Partition(T a[], int, int);
template <typename T> void QuickSort(T a[], int, int);
template <typename T> void ShellSort(T a[], int, int);
template <typename T> void HeapSort(T a[], int, int);

void Test()
{
	cout << "数据初始化中..." << endl;
	int **testData = new int *[SortFunNum];
	for (int i = 0; i < SortFunNum; ++i)
		testData[i] = new int[NUM];
	for (int k = 0; k < NUM; ++k)
	{
		testData[0][k] = rand();
		for (int j = 1; j < SortFunNum; ++j)
			testData[j][k] = testData[0][k];
	}
	cout << "数据初始化完成!" << endl;
	clock_t begin, end;

	begin = clock();
	HeapSort(testData[6], 0, NUM - 1);
	end = clock();
	cout << setw(20) << "堆排序用时: " << setw(4) << (end - begin) / CLOCKS_PER_SEC << "秒" << setw(4) <<
		1000 * double((end - begin) % CLOCKS_PER_SEC) / CLOCKS_PER_SEC << "毫秒" << endl;

	begin = clock();
	QuickSort(testData[5], 0, NUM - 1);
	end = clock();
	cout << setw(20) << "快速排序用时: " << setw(4) << (end - begin) / CLOCKS_PER_SEC << "秒" << setw(4) <<
		1000 * double((end - begin) % CLOCKS_PER_SEC) / CLOCKS_PER_SEC << "毫秒" << endl;

	begin = clock();
	MergeSort(testData[4], 0, NUM - 1);
	end = clock();
	cout << setw(20) << "归并排序用时: " << setw(4) << (end - begin) / CLOCKS_PER_SEC << "秒" << setw(4) <<
		1000 * double((end - begin) % CLOCKS_PER_SEC) / CLOCKS_PER_SEC << "毫秒" << endl;

	
	begin = clock();
	InsertSort(testData[2], 0, NUM - 1);
	end = clock();
	cout << setw(20) << "插入排序用时: " << setw(4) << (end - begin) / CLOCKS_PER_SEC << "秒" << setw(4) <<
		1000 * double((end - begin) % CLOCKS_PER_SEC) / CLOCKS_PER_SEC << "毫秒" << endl;

	begin = clock();
	ShellSort(testData[7], 0, NUM - 1);
	end = clock();
	cout << setw(20) << "希尔排序用时: " << setw(4) << (end - begin) / CLOCKS_PER_SEC << "秒" << setw(4) <<
		1000 * double((end - begin) % CLOCKS_PER_SEC) / CLOCKS_PER_SEC << "毫秒" << endl;

	begin = clock();
	SelectSort(testData[1], 0, NUM - 1);
	end = clock();
	cout <<setw(20) << "选择排序用时: " << setw(4) << (end - begin) / CLOCKS_PER_SEC << "秒" << setw(4) <<
		1000 * double((end - begin) % CLOCKS_PER_SEC) / CLOCKS_PER_SEC << "毫秒" << endl;

	begin = clock();
	RankSort(testData[3], 0, NUM - 1);
	end = clock();
	cout << setw(20) << "计数排序用时: " << setw(4) << (end - begin) / CLOCKS_PER_SEC << "秒" << setw(4) <<
		1000 * double((end - begin) % CLOCKS_PER_SEC) / CLOCKS_PER_SEC << "毫秒" << endl;

	begin = clock();
	BubleSort(testData[0], 0, NUM - 1);
	end = clock();
	cout << setw(20) << "冒泡排序用时: " << setw(4) << (end - begin) / CLOCKS_PER_SEC << "秒" << setw(4) <<
		1000 * double((end - begin) % CLOCKS_PER_SEC) / CLOCKS_PER_SEC << "毫秒" << endl;
	
	
	for (int i = 0; i < SortFunNum; ++i)
		delete[] testData[i];
	delete[] testData;
}

int main()
{
	srand(time(0));
	while (1)
	{
		cout << "输入测试数据长度: ";
		cin >> NUM;
		Test();
		cout << "测试完成!" << endl << endl;;
	}
	
	cin.get();
	cin.get();
	return 0;
}












/*冒泡排序*/
template <typename T>
void BubleSort(T a[], int first, int last)
{
	int has = 1;
	for (int i = last; i > first && has; --i)
	{
		has = 0;
		for (int j = first; j < i; ++j)
		{
			if (a[j] > a[j + 1])
			{
				swap(a[j], a[j + 1]);
				has = 1;
			}

		}
	}
}

/*选择排序*/
template <typename T>
void SelectSort(T a[], int first, int last)
{
	int m;
	for (int i = last; i > first; --i)
	{
		m = i;
		for (int j = first; j < i; ++j)
		{
			if (a[j] > a[m])
				m = j;
		}
		swap(a[m], a[i]);

	}
}


/*插入排序*/
template <typename T>
void InsertSort(T a[], int first, int last)
{
	int j;
	T t;
	for (int i = first + 1; i <= last; ++i)
	{
		t = a[i];
		j = i - 1;
		while (a[j] > t && j >= 0)
		{
			a[j + 1] = a[j];
			--j;
		}
		a[j + 1] = t;
	}
}

/*计数排序*/
template <typename T>
void RankSort(T a[], int first, int last)
{
	int sum = last - first + 1;
	int *rank = new int[sum];
	T *b = new T[sum];
	for (int i = 0; i < sum; ++i)
	{
		rank[i] = 0;
		b[i] = a[first + i];
	}

	for (int m = first; m <= last; ++m)
	{
		for (int n = first; n < m; ++n)
		{
			if (a[m] > a[n])
				rank[m - first]++;
			else
				rank[n - first]++;
		}
	}
	for (int k = 0; k < sum; ++k)
	{
		a[first + rank[k]] = b[k];
	}
	delete[] b;
	delete[] rank;
}

/*归并,用于归并排序*/
template <typename T>
void Merge(T a[], int first, int mid, int last)
{
	if (last - first < 1)
		return;
	T *b = new T[last - first + 1];
	int m = first, n = mid, bi = -1;
	while (m < mid && n <= last)
	{
		if (a[m] > a[n])
			b[++bi] = a[n++];
		else
			b[++bi] = a[m++];
	}
	while (m < mid)
		b[++bi] = a[m++];
	while (n <= last)
		b[++bi] = a[n++];
	while (bi >= 0)
	{
		a[first + bi] = b[bi];
		--bi;
	}

	delete[] b;

}
/*归并排序*/
template <typename T>
void MergeSort(T a[], int first, int last)
{
	if (last - first + 1 >= 2)
	{
		int mid = (first + last) / 2;
		MergeSort(a, first, mid);
		MergeSort(a, mid + 1, last);
		Merge(a, first, mid + 1, last);
	}
}

/*划分,用于快速排序*/
template <typename T>
int Partition(T a[], int first, int last)
{
	swap(a[rand() % (last - first + 1) + first], a[last]); //随机交换
	int m = last;
	int j = first - 1;
	for (int i = first; i < last; ++i)
	{
		if (a[i] < a[m])
		{
			++j;
			swap(a[j], a[i]);
		}
	}
	swap(a[m], a[j + 1]);
	return j + 1;

}
/*快速排序*/
template <typename T>
void QuickSort(T a[], int first, int last)
{
	if (last - first + 1 >= 2)
	{
		int m = Partition(a, first, last);
		QuickSort(a, first, m - 1);
		QuickSort(a, m + 1, last);
	}
}

/*希尔排序*/
template <typename T>
void ShellSort(T a[], int first, int last)
{
	int sum = last - first + 1;
	T t;
	int j;
	for (int d = sum / 2; d >= 1; d /= 2)
	{
		for (int i = d; i <= sum; i += d)
		{
			t = a[first - 1 + i];
			j = i - d;
			while (j >= 0 && a[first - 1 + j] > t)
			{
				a[first - 1 + j + d] = a[first - 1 + j];
				j -= d;
			}
			a[first - 1 + j + d] = t;
		}
	}
}

/*堆排序*/
template <typename T>
void HeapSort(T a[], int first, int last)
{
	int num = last - first + 1;
	int f, c;
	T t;
	for (f = num / 2; f >= 1; --f)
	{
		c = f * 2;
		t = a[first - 1 + f];
		while (c < num)
		{
			if (c + 1 <= num && a[first + c] > a[first - 1 + c])
				++c;
			if (t > a[first - 1 + c])
				break;
			a[first - 1 + c / 2] = a[first - 1 + c];
			c *= 2;
		}
		a[first - 1 + c / 2] = t;
	}

	while (num > 1)
	{
		swap(a[first], a[first + num - 1]);
		c = 2;
		t = a[first];

		while (c < num)
		{
			if (c + 1 < num && a[first + c] > a[first - 1 + c])
				++c;
			if (a[first - 1 + c] < t)
				break;
			a[first - 1 + c / 2] = a[first - 1 + c];
			c *= 2;
		}
		a[first - 1 + c / 2] = t;
		--num;
	}
}



转载于:https://www.cnblogs.com/xyyh/p/3980281.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

八大排序算法源码 + 耗时长度比较 的相关文章

随机推荐

  • HDU 2246 考研路茫茫——考试大纲

    HDU 2246 考研路茫茫 考试大纲 聽說這題要打表999 43 就傻傻的從0 N一個個地貼在代碼上了 打了幾個文件 xff0c 一同學就說我錯了 xff0c 杯具 因為提交上去的代碼長度不能超64K 白打了 xff0c 不過提示我測試數
  • MariaDB简介

    一 什么是数据库 DB 与 DBMS xff1a DB xff08 DataBase xff09 即数据库 xff0c 存储已经组织好的数据的容器 DBMS xff08 DataBase Manage System xff09 是数据库管理
  • 面试问题之操作系统:动态链接库和静态链接库的区别

    动态链接库是一个可以被其它应用程序共享的程序模块 xff0c 其中封装了一些可以被共享的例程和资源 动态链接库文件名的扩展名一般是dll xff0c 也有可能是drv xff0c sys和fon xff0c 它和可执行文件 exe 非常类似
  • linux中使用Crontab定时执行java的jar包无法使用环境变量的问题

    1 crontab简单使用 cmd 其实就是5个星星的事情 xff0c 随便百度一下吧 5个时间标签用来标注执行的设定 比如每5分钟执行一次 5 cmd 要特别注意 2 有些命令在命令行里执行很好 xff0c 到了crontab里面不能正常
  • Linux内核版本介绍与查询

    Linux内核版本命名在不同时期有着不同的规范 xff0c 在涉及到Linux版本问题时经常容易混淆 xff0c 主线版本 xff0f 稳定版 xff0f 长期支持版本经常搞不清楚 xff0c 本文主要记录下内核版本命名的规则以及如何查看L
  • kvm介绍

    KVM Kernel Based Virtual Machines 是一个基于Linux内核的虚拟化技术 可以直接将Linux内核转换为Hypervisor xff08 系统管理程 序 xff09 从而使得Linux 内核能够直接管理虚拟机
  • linux安装Topicons Plus解决图标不显示问题

    安装TopIcons Plus地址 https extensions gnome org extension 1031 topicons 1 点击链接下载安装包 然后解压 2 把解压后的文件包 移动到此路径下 xff1a usr share
  • 图像缩放算法(最临近点插值算法、双线性内插值算法、双立方插值算法)

    1 最临近点插值算法 xff1a 当一张 xff08 N M xff09 大小的图像放大到 xff08 xff08 j N xff09 xff08 k M xff09 xff09 时 xff0c 那么两张图像之间的像素点存在对应关系 xff
  • C语言float是什么类型,float是什么数据类型?

    float是浮点型数据类型 float是C语言的基本数据类型中的一种 xff0c 表示单精度浮点数 C语言规定单精度浮点型在内存占用4个字节 xff0c 精度为7位 xff0c 取值范围为 xff1a 3 4 10 38 3 4 10 38
  • 服务器文件 修改,服务器文件修改

    服务器文件修改 内容精选 换一换 远程连接Linux云服务器报错 xff1a Module is unknown修改此问题需要重启进入救援模式 xff0c 请评估风险后进行操作 本节操作涉及云服务器重启操作 xff0c 可能会导致业务中断
  • linux 批量重启机器脚本,(Linux) 一键批量启动、停止、重启Jar包Shell脚本

    废话不多说 xff0c 直接上脚本 xff0c 我这里是以spring cloud项目做的示例 bin sh export EUREKA 61 family eureka 1 0 0 jar export GATEWAY 61 family
  • python用post提交数据_python通过post提交数据的方法

    本文实例讲述了python通过post提交数据的方法 分享给大家供大家参考 具体实现方法如下 xff1a coding cp936 import urllib2 import urllib def postHttp name 61 None
  • Linux shell flock详解,Linux shell:Flock简介

    简介 当多个进程操作同一份资源时 xff0c 为了避免损坏数据 xff0c 每个进程在运行时都要保证其它进程没有同时操作资源 xff0c 这时通过flock命令给资源加锁可以实现此需求 flock 在打开的文件上应用或删除咨询锁 命令flo
  • 如何学习计算机编程语言

    关于如何学习计算机编程语言 xff08 C C 43 43 Java Python PHP xff09 1 计算机编程语言是我们和计算机交流信息的载体 xff0c 我们通过它和计算机 说话 xff0c 计算机听到我们说的话 xff0c 领会
  • WebRTC音视频同步

    这两篇文章 xff0c 可以直接去看 xff1b WebRTC音视频同步机制实现分析 https www jianshu com p 3a4d24a71091 WebRTC音视频同步分析 https blog csdn net lincai
  • nginx编译,修改日志路径

    1 configure without http rewrite module 2 修改objs ngx auto config h ifndef NGX PID PATH define NGX PID PATH 34 var logs n
  • 什么是MySQL执行计划

    要对执行计划有个比较好的理解 xff0c 需要先对MySQL的基础结构及查询基本原理有简单的了解 MySQL本身的功能架构分为三个部分 xff0c 分别是 应用层 逻辑层 物理层 xff0c 不只是MySQL xff0c 其他大多数数据库产
  • SPSS详细操作:生存资料的Cox回归分析

    SPSS详细操作 xff1a 生存资料的Cox回归分析 一 问题与数据 某研究者拟观察某新药的抗肿瘤效果 xff0c 将70名肺癌患者随机分为两组 xff0c 分别采用该新药和常规药物进行治疗 xff0c 观察两组肺癌患者的生存情况 xff
  • 生产者和消费者模型

    生产者和消费者模型 1 什么是生产者和消费者模型 生产者消费者模型具体来讲 xff0c 就是在一个系统中 xff0c 存在生产者和消费者两种角色 xff0c 他们通过内存缓冲区进行通信 xff0c 生产者生产消费者需要的资料 xff0c 消
  • 八大排序算法源码 + 耗时长度比较

    八大排序算法的排序时间长度的比较 xff0c 测试数据10000000时部分结果如下 输入测试数据长度 10000000 数据初始化中 数据初始化完成 堆排序用时 8秒 499毫秒 快速排序用时 22秒 35毫秒 归并排序用时 34秒 47