GDPU 数据结构 天码行空13

文章目录

  • 一、【实验目的】
  • 二、【实验内容】
  • 三、实验源代码
  • 四、实验结果
  • 五、实验总结

一、【实验目的】

(1) 理解插入排序算法的实现过程;

(2)理解不同排序算法的时间复杂度及适用环境;

(3)了解算法性能测试的基本方法。

二、【实验内容】

1、以下是一个通过随机数来测试排序算法运行时间的程序,中间留出了加入排序算法的部分。其中可以通过修改RANDNUM的值来更改测试的数据量:

#include "stdio.h"
#include <stdlib.h>
#include <time.h>
#define RANDNUM 10000 //随机数的个数
void main()
{ int iRandNum[RANDNUM];//存放随机数clock_t first,second; //记录开始和结束时间(以毫秒为单位)int i;for(i=0;i<RANDNUM;i++){//产生1万个随机数iRandNum[i]=rand()%RANDNUM;}first=clock(); //开始时间//此处加入排序程序second=clock();//结束时间//显示排序算法所用的时间
}

2、从选择、交换、插入排序算法中任选至少3种排序算法(希尔排序、快速排序、堆排序三选二),在无序状态下进行多次运行,记录运行时间,并比较测试结果。
提示:在程序的实现过程中要用到以下函数,请大家在实验之前自学这几个函数的用法:

1)随机函数rand()

  1. 时间函数clock()

实验参考界面如下(此界面测试数据仅选用了两种算法,提交的报告以实验要求为准。):

在这里插入图片描述

三、实验源代码

#include "stdio.h"
#include <iostream>
#include<cstring>
#include <stdlib.h>
#include <time.h>
using namespace std;int N = 10000; //随机数的个数//插入入排序
void insertSort(int arr[])
{int n = N;for (int i = 1; i < n; i++) {int key = arr[i];int j = i - 1;// 将 key 插入到已排序的序列中while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}
}//希尔排序
void shellSort(int arr[]) {int n = N;int i, j, gap, temp;for (gap = n / 2; gap > 0; gap /= 2) {for (i = gap; i < n; i++) {temp = arr[i];for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {arr[j] = arr[j - gap];}arr[j] = temp;}}
}//快速排序
void quickSort(int s[], int l, int r)
{if (l < r){//Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1int i = l, j = r, x = s[l];while (i < j){while(i < j && s[j] >= x) // 从右向左找第一个小于x的数j--;  if(i < j) s[i++] = s[j];while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数i++;  if(i < j) s[j--] = s[i];}s[i] = x;quickSort(s, l, i - 1); // 递归调用 quickSort(s, i + 1, r);}
}//堆排序
void swap(int *a, int *b) {int temp = *b;*b = *a;*a = temp;
}void max_heapify(int arr[], int start, int end) {// 建立父節點指標和子節點指標int dad = start;int son = dad * 2 + 1;while (son <= end) { // 若子節點指標在範圍內才做比較if (son + 1 <= end && arr[son] < arr[son + 1]) // 先比較兩個子節點大小,選擇最大的son++;if (arr[dad] > arr[son]) //如果父節點大於子節點代表調整完畢,直接跳出函數return;else { // 否則交換父子內容再繼續子節點和孫節點比較swap(&arr[dad], &arr[son]);dad = son;son = dad * 2 + 1;}}
}void heapSort(int arr[], int len) {int i;// 初始化,i從最後一個父節點開始調整for (i = len / 2 - 1; i >= 0; i--)max_heapify(arr, i, len - 1);// 先將第一個元素和已排好元素前一位做交換,再重新調整,直到排序完畢for (i = len - 1; i > 0; i--) {swap(&arr[0], &arr[i]);max_heapify(arr, 0, i - 1);}
}
//输出数组 a 的前20为元素,元素不足20个则输出全部
void print(int a[])
{int n =  N < 20 ? N : 20;for(int i=0;i<n;i++)cout << a[i] << " ";cout << endl;
}//产生随机数填充a数组
void init(int a[])
{for(int i=0;i<N;i++)a[i]=rand()%1000000;
}double getQuickSortTime(int a[])
{
//	cout << "排序前数组的前20位元素:\n";
//	print(a);clock_t first,second; //记录开始和结束时间(以毫秒为单位)first=clock(); //开始时间quickSort(a,0,N-1);second=clock();//结束时间
//	cout << "排序后数组的前20位元素:\n";
//	print(a);return (double)(second - first) / CLOCKS_PER_SEC;
}double getShellSortTime(int a[])
{clock_t first,second; //记录开始和结束时间(以毫秒为单位)
//	cout << "排序前数组的前20位元素:\n";
//	print(a);first=clock(); //开始时间shellSort(a);second=clock();//结束时间
//	cout << "排序后数组的前20位元素:\n";
//	print(a);return (double)(second - first) / CLOCKS_PER_SEC;
}double getHeapSortTime(int a[])
{clock_t first,second; //记录开始和结束时间(以毫秒为单位)
//	cout << "排序前数组的前20位元素:\n";
//	print(a);first=clock(); //开始时间heapSort(a,N);second=clock();//结束时间
//	cout << "排序后数组的前20位元素:\n";
//	print(a);return (double)(second - first) / CLOCKS_PER_SEC;
}void testSort()
{double quick = 0.0;double shell = 0.0;double heap = 0.0;int cnt = 10;//测试次数int a[N];//存放随机数for(int i = 0; i < cnt; i++){
//		if(i%5 == 0)
//			N *= 10;init(a);int t[N];memcpy(t,a,N);quick += getQuickSortTime(t);memcpy(t,a,N);shell += getShellSortTime(t);memcpy(t,a,N);heap += getHeapSortTime(t);}
//	cout.precision(5);cout.setf(ios::fixed);cout << "基于"<< N <<"个元素的随机数组进行排序,测试"<<cnt<<"次取平均值的结果如下:\n";cout << "快速排序:" << quick/cnt << "s\n";cout << "希尔排序:" << shell/cnt << "s\n";cout << " 堆排序 :" << heap/cnt << "s\n";
}int main()
{ testSort();//	cout << "排序前数组的前20位元素:\n";
//	print(iN);
//	heapSort(iN,N);//显示排序算法所用的时间
//	cout << "排序后数组的前20位元素:\n";
//	cout <<"first: " << first << " second: " << second << endl; 
//	cout << "排序耗费的时间:";
//	cout <<  (double)(second - first) / CLOCKS_PER_SEC << "s" << endl;
}

四、实验结果

基于10000个元素的随机数组进行排序,测试10次取平均值的结果如下:
快速排序:0.008402s
希尔排序:0.001554s堆排序 :0.001759s

五、实验总结

奇了怪了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/257230.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

入门指南:使用Prometheus监控Linux服务器

Prometheus介绍 Prometheus是一款开源的监控系统&#xff0c;主要用于收集、存储和查询时间序列数据&#xff0c;以便于对系统进行监控和分析。以下是Prometheus的架构图介绍&#xff1a; Prometheus的架构由四个主要组件组成&#xff1a; Prometheus Server&#xff08;Prom…

Javascript 函数介绍

Javascript 函数介绍 很多教程书一上来就讲解一堆语法&#xff0c;例如函数定义、函数调用什么。等读者看完了函数这一章都没搞懂什么是函数。 在讲解什么叫函数之前&#xff0c;我们先看下面一段代码&#xff1a; <!DOCTYPE html> <html xmlns"http://www.w3.…

Spring(Spring/Springboot 的创建) 基础

一. Spring 1.1 Spring是什么&#xff1f; Spring 指的是 Spring Frameword(Spring 框架),它是一个开源框架。 Spring 是包含了众多工具方法的IoC容器。 1.2 什么是容器&#xff1f; 容器时用来容纳某种物品的装置。 我们之前接触到的容器&#xff1a; • List/Map ->…

【深度学习】强化学习(一)强化学习定义

文章目录 一、强化学习问题1、交互的对象1. 智能体&#xff08;Agent&#xff09;2. 环境&#xff08;Environment&#xff09; 2、强化学习的基本要素1. 状态 &#x1d460;2. 动作 &#x1d44e;3. 策略 &#x1d70b;(&#x1d44e;|&#x1d460;)4. 状态转移概率 &#x1…

[HITCON 2017]SSRFme perl语言的 GET open file 造成rce

这里记录学习一下 perl的open缺陷 这里首先本地测试一下 发现这里使用open打开 的时候 如果通过管道符 就会实现命令执行 然后这里注意的是 perl 中的get 调用了 open的参数 所以其实我们可以通过管道符实现命令执行 然后这里如果file可控那么就继续可以实现命令执行 这里就…

用23种设计模式打造一个cocos creator的游戏框架----(一)生成器模式

1、模式标准 模式名称&#xff1a;生成器模式 模式分类&#xff1a;创建型 模式意图&#xff1a;将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 结构图&#xff1a; 适用于&#xff1a; 当创建复杂对象的算法应该独立于该对象的…

⭐Unity 搭建UDP客户端(01) 配合网络调试助手测试

1.接收来自服务器的消息 using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using UnityEngine;public class UDPManager:MonoBehaviour {public string recvStr; //服务器返回值public string UDPClientAddRess "192.168.2.39&q…

儿童护栏围栏CE认证EN1930检测标准

儿童门护栏也叫儿童游戏围栏&#xff0c;游戏围栏和儿童护栏&#xff0c;安全护栏等。市面上的儿童围栏以塑料&#xff0c;木质材料结构为主。主要作用是为了解放妈妈的双手&#xff0c;提供一个安全舒适的环境给6个月-3岁的宝宝。使用儿童围栏有利于培养宝宝的独立意识&#x…

深入探索C语言中的二叉树:数据结构之旅

引言 在计算机科学领域&#xff0c;数据结构是基础中的基础。在众多数据结构中&#xff0c;二叉树因其在各种操作中的高效性而脱颖而出。二叉树是一种特殊的树形结构&#xff0c;每个节点最多有两个子节点&#xff1a;左子节点和右子节点。这种结构使得搜索、插入、删除等操作…

C# 图解教程 第5版 —— 第17章 转换

文章目录 17.1 什么是转换17.2 隐式转换17.3 显示转换和强制转换17.4 转换的类型17.5 数字的转换17.5.1 隐式数字转换17.5.2 溢出检测上下文17.5.3 显示数字转换 17.6 引用转换17.6.1 隐式引用转换17.6.2 显式引用转换17.6.3 有效显式引用转换 17.7 装箱转换17.7.1 装箱是创建副…

概率测度理论方法(第 2 部分)

一、说明 欢迎回到这个三部曲的第二部分&#xff01;在第一部分中&#xff0c;我们为测度论概率奠定了基础。我们探索了测量和可测量空间的概念&#xff0c;并使用这些概念定义了概率空间。在本文中&#xff0c;我们使用测度论来理解随机变量。 作为一个小回顾&#xff0c;在第…

贪吃的猴子 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 一只贪吃的猴子&#xff0c;来到一个果园&#xff0c;发现许多串香蕉排成一行&#xff0c;每串香蕉上有若干根香蕉。每串香蕉的根数由数组numbers给出。猴子获取香…