实现一个排序算法并统计其运行时间

合集下载

排序算法的比较及时间

排序算法的比较及时间

题目:排序算法比较设计目的:1.掌握各种排序的基本思想。

2.掌握各种排序方法的算法实现。

3.掌握各种排序方法的优劣分析及花费的时间的计算。

4.掌握各种排序方法所适应的不同场合。

二、设计内容和要求利用随机函数产生30000个随机整数,利用插入排序、起泡排序、选择排序、快速排序、堆排序、归并排序等排序方法进行排序,并统计每一种排序上机所花费的时间。

函数说明cha_ru_sort(int nData[], unsigned int nNum) 插入排序maopao_sort(int maopao_data[],int maopao_n) 起泡排序select_sort(int *Data,int nLen) 选择排序QuickSort(int* pData,int nLen) 快速排序HeapSort(int array[],int length) 堆排序MergeSort(int sourceArr[], int targetArr[], int startIndex, int endIndex) 归并排序无参数返回**************************************************************/#include<stdio.h>#include<stdlib.h>//#include"stdlib.h"??//随机函数头文件#include<time.h>#define rand_number 30000 //产生随机数的个数int rand_numbers_30000_0[rand_number]={0},rand_numbers_30000_1[rand_number]={0}; int min,max; //随机数的范围//***************************************************************//功能:产生随机数//无参数返回void produce_rand_num(){int i;for(i=0;i<rand_number;i++){rand_numbers_30000_0[i]=min+rand()%max;}}/****************************************************************************** ***///函数名:插入排序////功能描述:插入排序从下到大,nData为要排序的数据,nNum为数据的个数,该排序是稳定的排序//一个数就是已经排列好的了,所以从数组第二个数开始进行插入排序////无参数返回/****************************************************************************** ***/void cha_ru_sort(int nData[], unsigned int nNum){unsigned int i,j,k;for( i = 1 ; i < nNum; i++){int nTemp = nData[i]; //从数组中的第二个数开始获取数据for( j = 0 ; j < i; j++)//对该数,寻找他要插入的位置{if(nData[j]>nTemp)//找到位置,然后插入该位置,之后的数据后移{for( k = i; k > j ;--k)//数据后移{nData[k]=nData[k-1];}nData[j]=nTemp;//将数据插入到指定位置break;}}}}/****************************************************************************** ***///函数名:冒泡排序////功能描述:/****************************************************************************** ***///冒泡排序,maopao_data要排序的数据,maopao_n数据的个数void maopao_sort(int maopao_data[],int maopao_n){unsigned char flag=0;//flag为1表示排序结束,初始化为0int i,j;int nTemp;//i从[0,maopao_n-1)开始冒泡,确定第i个元素for( i=0 ; i<maopao_n-1 ; i++)//比较maopao_n-1次{//从[maopao_n - 1, i)检查是否比上面一个小,把小的冒泡浮上去for(j=0;j<maopao_n- 1 -i ; j++){if( maopao_data[j] > maopao_data[j+1]) //如果下面的比上面小,交换{nTemp=maopao_data[j];maopao_data[j] = maopao_data[j+1];maopao_data[j+1]=nTemp;}}}}///****************************************************************************** ***///函数名:选择排序////功能描述:/****************************************************************************** ***///选择排序//选择排序,pnData要排序的数据,nLen数据的个数void select_sort(int *Data,int nLen){int nIndex,i,j,nTemp;//i从[0,nLen-1)开始选择,确定第i个元素for(i=0;i<nLen-1;i++){nIndex=i;//遍历剩余数据,选择出当前最小的数据for(j=i+1;j<nLen;j++){if(Data[j]<Data[nIndex]){nIndex=j;}}//如果当前最小数据索引不是i,也就是说排在i位置的数据不在nIndex处if(nIndex!=i){//交换数据,确定i位置的数据。

时间片轮转算法计算公式

时间片轮转算法计算公式

时间片轮转算法计算公式时间片轮转算法是一种常见的调度算法,用于操作系统中的进程调度。

它的主要思想是将CPU的执行时间分成若干个时间片,每个进程在一个时间片内得到一定的执行时间,然后被挂起,等待下一个时间片再次执行。

这种算法的优点是公平性好,所有进程都有机会得到执行,缺点是对于I/O密集型的进程效率较低。

在时间片轮转算法中,我们需要计算每个进程在一个时间片内的执行时间,以及每个进程在队列中的等待时间。

这些计算可以通过以下公式来实现:1. 计算每个进程在一个时间片内的执行时间:假设一个时间片的长度为T,进程P_i在一个时间片内的执行时间为E_i,则有:E_i = min(T, R_i)。

其中,R_i表示进程P_i还需要执行的时间。

如果R_i小于T,则进程P_i在一个时间片内执行完毕,执行时间为R_i;如果R_i大于T,则进程P_i在一个时间片内无法执行完毕,执行时间为T。

2. 计算每个进程在队列中的等待时间:假设进程P_i在队列中的等待时间为W_i,则有:W_i = (n-1) T。

其中,n表示进程P_i在队列中的位置。

假设队列中有m个进程,则进程P_i 在队列中的位置为i,因此n = m i + 1。

通过以上两个公式,我们可以计算出每个进程在一个时间片内的执行时间,以及每个进程在队列中的等待时间。

这些计算结果可以帮助操作系统进行进程调度,保证每个进程都能够得到公平的执行机会。

除了上述计算公式,时间片轮转算法还需要考虑一些特殊情况,比如进程在一个时间片内执行完毕的情况,以及新进程的加入等情况。

针对这些情况,我们可以通过适当的调整计算公式来实现。

总之,时间片轮转算法是一种常见的进程调度算法,通过合理的计算公式可以实现对进程执行时间和等待时间的计算,从而保证进程的公平执行。

这些计算公式为操作系统提供了重要的参考,帮助操作系统进行进程调度,提高系统的性能和效率。

时间复杂度练习题

时间复杂度练习题

时间复杂度练习题一、基础知识题1. 请简述时间复杂度的定义及其在算法分析中的重要性。

2. 常见的时间复杂度有哪些?请按从低到高的顺序排列。

4. 请举例说明一个O(n)时间复杂度的算法。

5. 如何计算一个循环语句的时间复杂度?二、选择题A. O(n^3)B. O(2^n)C. O(1)D. O(n!)2. 一个算法的时间复杂度为O(n),如果输入规模n增加10倍,其运行时间将如何变化?A. 减少到原来的1/10B. 增加到原来的10倍C. 增加到原来的100倍D. 不确定A. 二分查找B. 冒泡排序C. 快速排序D. 选择排序A. 遍历一个长度为n的数组B. 遍历一个长度为n的链表C. 遍历一个长度为n的数组,并对每个元素进行一次操作D. 遍历一个长度为n的数组,并对每对元素进行一次操作三、计算题for i in range(n):for j in range(n):print(i, j)for i in range(n):print(i)while head:print(head.val)head = head.next四、分析题def bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, ni1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j] def binary_search(arr, target):left, right = 0, len(arr) 1while left <= right:mid = (left + right) // 2if arr[mid] == target:return midelif arr[mid] < target:left = mid + 1else:right = mid 1def factorial(n):if n == 0:return 1else:return n factorial(n1)五、判断题1. 一个算法的时间复杂度与输入数据的顺序无关。

c语言计数排序算法

c语言计数排序算法

c语言计数排序算法C语言计数排序算法计数排序是一种用于整数排序的线性时间复杂度算法,它利用了输入的数字的范围比输入的个数大的特点。

计数排序的基本思想是,对于给定的输入序列中的每一个元素x,确定小于x的元素个数。

通过这个信息,可以直接把x放到它在输出序列中的位置上。

计数排序的时间复杂度为O(n+k),其中n是输入序列的长度,k是输入序列中的最大值。

计数排序的步骤如下:1. 找出输入序列的最大值max,确定计数数组的大小为max+1。

2. 初始化计数数组count,将其所有元素置为0。

3. 遍历输入序列,统计每个元素出现的次数,将统计结果存入计数数组count中。

4. 对计数数组count进行累加操作,得到每个元素在输出序列中的位置。

5. 创建与输入序列相同大小的临时数组output。

6. 遍历输入序列,将每个元素放到output数组中的正确位置上。

7. 将output数组复制回输入序列,完成排序。

下面以一个例子来说明计数排序的过程。

假设输入序列为[4, 2, 5, 7, 1, 3, 4, 5],最大值为7。

确定计数数组的大小为8,初始化计数数组count为[0, 0, 0, 0, 0, 0, 0, 0]。

然后,遍历输入序列,统计每个元素出现的次数,得到计数数组count为[1, 1, 1, 2, 0, 2, 0, 1]。

接下来,对计数数组count进行累加操作,得到每个元素在输出序列中的位置,得到计数数组count为[1, 2, 3, 5, 5, 7, 7, 8]。

创建临时数组output,大小与输入序列相同。

然后,遍历输入序列,将每个元素放到output数组中的正确位置上,得到output数组为[1, 2, 3, 4, 4, 5, 5, 7]。

将output数组复制回输入序列,完成排序。

此时,输入序列变为[1, 2, 3, 4, 4, 5, 5, 7],排序完成。

可以看到,计数排序是一种稳定的排序算法,它可以用于对整数进行排序,并且具有线性时间复杂度。

算法与分析实验报告

算法与分析实验报告

算法与分析实验报告一、引言算法是现代计算机科学中的核心概念,通过合理设计的算法可以解决复杂的问题,并提高计算机程序的执行效率。

本次实验旨在通过实际操作和数据统计,对比分析不同算法的执行效率,探究不同算法对于解决特定问题的适用性和优劣之处。

二、实验内容本次实验涉及两个经典的算法问题:排序和搜索。

具体实验内容如下:1. 排序算法- 冒泡排序- 插入排序- 快速排序2. 搜索算法- 顺序搜索- 二分搜索为了对比不同算法的执行效率,我们需要设计合适的测试用例并记录程序执行时间进行比较。

实验中,我们将使用随机生成的整数数组作为排序和搜索的测试数据,并统计执行时间。

三、实验步骤1. 算法实现与优化- 实现冒泡排序、插入排序和快速排序算法,并对算法进行优化,提高执行效率。

- 实现顺序搜索和二分搜索算法。

2. 数据生成- 设计随机整数数组生成函数,生成不同大小的测试数据。

3. 实验设计- 设计实验方案,包括测试数据的规模、重复次数等。

4. 实验执行与数据收集- 使用不同算法对随机整数数组进行排序和搜索操作,记录执行时间。

- 多次重复同样的操作,取平均值以减小误差。

5. 数据分析与结果展示- 将实验收集到的数据进行分析,并展示在数据表格或图表中。

四、实验结果根据实验数据的收集与分析,我们得到以下结果:1. 排序算法的比较- 冒泡排序:平均执行时间较长,不适用于大规模数据排序。

- 插入排序:执行效率一般,在中等规模数据排序中表现良好。

- 快速排序:执行效率最高,适用于大规模数据排序。

2. 搜索算法的比较- 顺序搜索:执行时间与数据规模成线性关系,适用于小规模数据搜索。

- 二分搜索:执行时间与数据规模呈对数关系,适用于大规模有序数据搜索。

实验结果表明,不同算法适用于不同规模和类型的问题。

正确选择和使用算法可以显著提高程序的执行效率和性能。

五、实验总结通过本次实验,我们深入了解了不同算法的原理和特点,并通过实际操作和数据分析对算法进行了比较和评估。

微机排序实验实验报告

微机排序实验实验报告

一、实验目的1. 熟悉排序算法的基本原理和实现方法。

2. 掌握各种排序算法的性能特点。

3. 通过编程实现常见的排序算法,并进行性能测试和分析。

二、实验内容1. 实现以下排序算法:(1)冒泡排序(2)选择排序(3)插入排序(4)快速排序(5)归并排序2. 对生成的随机数据进行排序,并统计每种排序算法的运行时间。

3. 分析并比较各种排序算法的性能。

三、实验步骤1. 编写排序算法的代码。

(1)冒泡排序:通过比较相邻元素的大小,如果顺序错误则交换,重复这个过程,直到没有需要交换的元素。

(2)选择排序:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

以此类推,直到所有元素均排序完毕。

(3)插入排序:将未排序的数据元素插入到已排序的有序序列中,从而得到一个新的、有序的序列。

(4)快速排序:通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

(5)归并排序:将两个或两个以上的有序表合并成一个新的有序表。

2. 生成随机数据,并进行排序。

3. 使用计时器统计每种排序算法的运行时间。

4. 分析并比较各种排序算法的性能。

四、实验结果与分析1. 实验数据生成1000个随机数,范围在1到10000之间。

2. 实验结果(1)冒泡排序:运行时间约为0.002秒。

(2)选择排序:运行时间约为0.003秒。

(3)插入排序:运行时间约为0.004秒。

(4)快速排序:运行时间约为0.0005秒。

(5)归并排序:运行时间约为0.001秒。

3. 性能分析(1)冒泡排序、选择排序和插入排序属于O(n^2)复杂度的排序算法,其运行时间随着数据量的增加而迅速增加。

(2)快速排序和归并排序属于O(nlogn)复杂度的排序算法,其运行时间随着数据量的增加而逐渐增加,但增长速度较慢。

快速排序算法实验报告

快速排序算法实验报告

快速排序算法实验报告快速排序算法实验报告引言快速排序算法是一种高效的排序算法,它的时间复杂度为O(nlogn),在实际应用中被广泛使用。

本实验旨在通过实际的实验数据,验证快速排序算法的效果和性能,并对其进行分析和总结。

实验设计本实验采用C++语言编写快速排序算法,并通过随机生成的数据进行排序实验。

实验中使用了不同规模的数据集,并记录了排序所需的时间和比较次数。

实验步骤1. 实现快速排序算法快速排序算法的核心思想是通过选取一个基准元素,将待排序的序列分为两部分,一部分比基准元素小,一部分比基准元素大,然后对这两部分继续进行快速排序。

具体实现时,可以选择序列的第一个元素作为基准元素,然后使用分治法递归地对子序列进行排序。

2. 生成测试数据为了验证快速排序算法的性能,我们生成了不同规模的随机数序列作为测试数据。

测试数据的规模分别为1000、10000、100000和1000000。

3. 进行排序实验使用生成的测试数据,对快速排序算法进行实验。

记录每次排序所需的时间和比较次数,并将结果进行统计和分析。

实验结果通过对不同规模的数据集进行排序实验,我们得到了以下结果:数据规模排序时间(ms)比较次数1000 2 872810000 12 114846100000 124 13564771000000 1483 15737267分析与讨论从实验结果可以看出,随着数据规模的增大,排序所需的时间和比较次数也呈指数级增长。

这符合快速排序算法的时间复杂度为O(nlogn)的特性。

另外,通过观察实验结果,我们可以发现快速排序算法的性能受到多个因素的影响。

首先,基准元素的选择对算法的效率有很大的影响。

如果选择的基准元素恰好是序列的中位数,那么排序的效率会更高。

其次,数据的初始顺序也会影响排序的效果。

如果数据已经是有序的,那么快速排序算法的效率将大大降低。

此外,快速排序算法还存在一些优化的空间。

例如,可以通过随机选择基准元素来避免最坏情况的发生。

快速排序算法实验报告

快速排序算法实验报告

快速排序算法实验报告快速排序一、问题描述在操作系统中,我们总是希望以最短的时间处理完所有的任务。

但事情总是要一件件地做,任务也要操作系统一件件地处理。

当操作系统处理一件任务时,其他待处理的任务就需要等待。

虽然所有任务的处理时间不能降低,但我们可以安排它们的处理顺序,将耗时少的任务先处理,耗时多的任务后处理,这样就可以使所有任务等待的时间和最小。

只需要将n 件任务按用时去从小到大排序,就可以得到任务依次的处理顺序。

当有 n 件任务同时来临时,每件任务需要用时ni,求让所有任务等待的时间和最小的任务处理顺序。

二、需求分析1. 输入事件件数n,分别随机产生做完n件事所需要的时间;2. 对n件事所需的时间使用快速排序法,进行排序输出。

排序时,要求轴值随机产生。

3. 输入输出格式:输入:第一行是一个整数n,代表任务的件数。

接下来一行,有n个正整数,代表每件任务所用的时间。

输出:输出有n行,每行一个正整数,从第一行到最后一行依次代表着操作系统要处理的任务所用的时间。

按此顺序进行,则使得所有任务等待时间最小。

4. 测试数据:输入 95 3 4 26 1 57 3 输出1 2 3 3 4 5 5 6 7三、概要设计抽象数据类型因为此题不需要存储复杂的信息,故只需一个整型数组就可以了。

算法的基本思想对一个给定的进行快速排序,首先需要选择一个轴值,假设输入的数组中有k个小于轴值的数,于是这些数被放在数组最左边的k个位置上,而大于周知的结点被放在数组右边的n-k个位置上。

k也是轴值的下标。

这样k把数组分成了两个子数组。

分别对两个子数组,进行类似的操作,便能得到正确的排序结果。

程序的流程输入事件件数n-->随机产生做完没个事件所需时间-->对n个时间进行排序-->输出结果快速排序方法:初始状态 72 6 57 88 85 42 l r第一趟循环 72 6 57 88 85 42 l r 第一次交换 6 72 57 88 85 42 l r 第二趟循环 6 72 57 88 85 42 r l 第二次交换 72 6 57 88 85 42 r l反转交换 6 72 57 88 85 42 r l这就是依靠轴值,将数组分成两部分的实例。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<iostream> #include <algorithm> #include<stdlib.h> #include<dos.h> #include<time.h> #include<stdlib.h> #include<time.h> #include<fstream> using namespace std; class Array { protected:
ofstream ofs2("c:\\排序之后的数组(直接插入排序).txt",ios::app);//把排序之后的数组,
写进 c:\\排序之后的数组(直接插入排序).txt 中
for(i=0;i<n;i++)
{
ofs2<<a.GetArray(i)<<" ";
if((i+1)%5==0)
ofs2<<endl;
void Array::OutArray() {
for(int i=0;i<n;i++) {
if((i+1)%6==0)//每六个数换一次行 cout<<endl;
cout<<"a["<<i<<"]="<<a[i]<<" "; //输出 a[i]
} cout<<endl; }
void Array::QuickSort(int left,int right) {
a.Test();
totaltime=(double)(finsh-start)/CLOCKS_PER_SEC;
cout<<"\n 直接插入排序所花的 CPU 时间为"<<totaltime<<"秒!"<<endl;
ofstream ofs1("c:\\直接插入排序所花的 CPU 时间.txt",ios::app);//把直接插入排序所花的
break;
case 1:
Function();
break;
case 2:
Function1();
break;
}
}
void main()
{
Run();
}
{
ofs<<a.GetArray(i)<<" ";
if((i+1)%5==0)
ofs<<endl;
}
ofs<<" "<<endl;
// a.OutArray();/*显示排序之前的数组元素*/
start=clock();
a.InsertSort();
///!!!!!!!!!!!!!!
finsh=clock();
CPU 时间,写进 c:\\直接插入排序所花的 CPU 时间.txt 中
ofs1<<"规模为"<<n<<"直接插入排序所花的 CPU 时间为"<<totaltime<<"秒"<<"排序是
正确(true(1)/false(0))"<<test<<endl;
// a.OutArray();/*显示排序之后的数组元素*/
n=x; return n; } int GetArray(int i){return a[i];} void OutArray(); void QSort(){QuickSort(0,n-1);} void QuickSort(int left,int right);//快速排序 //void InSort(){InsertSort({1,2,3,4,5}, n);} bool Test();
ofs2<<a.GetArray(i)<<" ";
if((i+1)%5==0)
ofs2<<endl;
}
ofs2<<" "<<endl;
}
void Function1()
{
int n;//自定义数组长度
bool test;
clock_t start,finsh;//统计 CUP 时间的变量
double totaltime;//最终 CUP 所用的时间
ofs<<a.GetArray(i)<<" "; if((i+1)%5==0)
ofs<<endl; }
ofs<<" "<<endl; // a.OutArray();/*显示排序之前的数组元素*/ start=clock(); a.QSort(); finsh=clock(); a.Test(); totaltime=(double)(finsh-start)/CLOCKS_PER_SEC; cout<<"\n 快速排序所花的 CPU 时间为"<<totaltime<<"秒!"<<endl; ofstream ofs1("c:\\快速排序所花的 CPU 时间.txt",ios::app);//把快速排序所花的 CPU 时 间,写进 c:\\快速排序所花的 CPU 时间.txt 中 ofs1<<"规模为"<<n<<"快速排序所花的 CPU 时间为"<<totaltime<<"秒"<<"排序是正确 (true(1)/false(0))"<<test<<endl; // a.OutArray();/*显示排序之后的数组元素*/ ofstream ofs2("c:\\排序之后的数组(快速排序).txt",ios::app);//把排序之后的数组,写进 c:\\排序之后的数组(快速排序).txt 中 for(i=0;i<n;i++) {
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]); QuickSort(left,j-1);//对低端序列快速排序 QuickSort(j+1,right);//对高端序列快速排序 } }//快速排序
****"<<endl; 排序 ****"<<endl;
cout<<"****2.直接插入 排序 ****"<<endl;
cout<<"**************************"<<endl; cout<<"请选择排序的类型:"<<endl;
cin>>ch;
switch(ch)
{
case 0:
void InsertSort(); //直接插入排序
}; void Array::creat() {
if(n<=100000) { srand( (unsigned)time( NULL ) ); for(int i=0;i<n;i++) {
a[i]=rand()%n;//随机产生 0-(n-1)之间的数 } } else {
cout<<"请输入数组长度:";
cin>>n;
Array a(n,2);//定义 Array 类对象,实现数组的创建
ofstream ofs("c:\\排序之前的数组(直接插入排序).txt",ios::app);//把随机产生的数组,
写进 c:\\排序之前的数组(直接插入排序).txt 中
for(int i=0;i<n;i++)
}Байду номын сангаас
ofs2<<" "<<endl;
}
void Run()
{
system("color 1f");
int ch;
cout<<endl;
cout<<"**************************"<<endl;
cout<<"****
排序系统 ****"<<endl;
cout<<"****0.退出 cout<<"****1.快速
1.实现一个排序算法并统计其运行时间。包括:1) 实现一个排序算法;2) 利 用事后统计法观察其时间复杂度: 对于每组待排序记录,统计你的排序算法 排序所花的CPU时间。对于不同规模的输入,统计相应的CPU时间,并作出时 间随规模变化的统计图(利用某种方法生成足够大的输入, 将输入和输出存 到文件中以便于观察。);3) 你是如何确保你的排序是正确的?能否给出一个 测试排序正确性的函数?
相关文档
最新文档