第二周-项目三-排序算法的运行时间

本文介绍了一种排序算法的运行时间测试方法,通过选择排序算法(复杂度为O(n²))对大量数据进行排序,并统计了其运行时间。该测试使用C++实现,从文件中读取待排序数据。
/*                       
 * Copyright (c) 2017,烟台大学计算机学院                       
 * All right reserved.                       
 * 文件名称:main.cpp                      
 * 作者:马明祥                      
 * 完成日期:2017年12月07日                       
 * 版本号:v1.0                       
 *                       
 * 问题描述:排序算法的运行时间             
 * 输入描述:标准函数输入                       
 * 程序输出:标准函数输出                   
  /*     
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MAXNUM 100000
void selectsort(int a[], int n)
{
        int i, j, k, tmp;
        for(i = 0; i < n-1; i++)
        {
                k = i;
                for(j = i+1; j < n; j++)
                {
                        if(a[j] < a[k])
                                k = j;
                }
                if(k != j)
                {
                        tmp = a[i];
                        a[i] = a[k];
                        a[k] = tmp;
                }
        }
}

int main()
{
    int x[MAXNUM];
    int n = 0;
    double t1,t2;
    FILE *fp;
    fp = fopen("numbers.txt", "r");
    if(fp==NULL)
    {
        printf("打开文件错!请下载文件,并将之复制到与源程序文件同一文件夹下。\n");
        exit(1);
    }
    while(fscanf(fp, "%d", &x[n])!=EOF)
        n++;
    printf("数据量:%d, 开始排序....", n);
    t1=time(0);
    selectsort(x, n);
    t2=time(0);
    printf("用时 %d 秒!", (int)(t2-t1));
    fclose(fp);
    return 0;
}
排序是计算机科学中的一个基本问题,产生了很多种适合不同情况下适用的算法,也一直作为算法研究的热点。本项目提供两种排序算法,复杂度为O(n2)的选择排序selectsort,和复杂度为O(nlogn)的快速排序quicksort,在main函数中加入了对运行时间的统计。 
运行结果:
算法的运行时间与CPU的性能相关,且存在误差,运行时长会有波动。不同排序算法在不同数据规模下的运行时间增长情况各不相同,以下是一些常见排序算法运行时间情况: - **冒泡排序**:用冒泡排序排100000的数据会很久,时间呈$O(n^2)$递增,空间复杂度为$O(1)$,是一种稳定的排序算法。可以在第二个`for`循环里面做优化,但整体速度还是较慢。示例代码中,通过随机生成一个长度在500000左右的数组进行冒泡排序,记录其运行时间[^1][^2]。 ```java package sort; import java.util.Arrays; import java.util.Random; public class 冒泡排序 { public static void main(String[] args) { System.out.println("冒泡排序算法"); int array[] = rand(); long start = System.currentTimeMillis(); sort(array); long end = System.currentTimeMillis(); System.out.print("运行时间:"); System.out.println(end - start + "ms"); System.out.println("算法时间复杂度:n^2"); } public static int[] rand() { int n = new Random().nextInt(1) + 500000; System.out.println("数组长度:" + n); int a[] = new int[n]; for (int i = 0; i < n; i++) { a[i] = new Random().nextInt(100) + 1; } return a; } public static void sort(int[] arr) { for (int i = arr.length - 1; i > 0; i--) { for (int j = 0; j < i; j++) { // 冒泡排序 if (arr[j] > arr[j + 1]) { Swap(j, j + 1, arr); } } } } public static void Swap(int a, int b, int list[]) { int temp = list[a]; list[a] = list[b]; list[b] = temp; } } ``` - **其他排序算法运行时间复杂度**: - **插入算法**:最坏情况运行时间和平均情况/期望运行时间均为$O(n^2)$。 - **快速排序**:最坏情况运行时间为$O(n^2)$,平均情况/期望运行时间为$O(nlogn)$。 - **归并排序**:最坏情况运行时间和平均情况/期望运行时间均为$O(nlogn)$。 - **堆排序**:最坏情况运行时间为$O(nlogn)$,空间复杂度为$O(1)$。 - **希尔排序**:最坏情况运行时间为$O(n^2)$,平均情况运行时间为$O(n^{3/2})$。 - **桶排序**:最坏情况运行时间为$O(n^2)$,平均情况运行时间为$O(n)$ [^4]。 有人在调试数据量较小时,发现简单算法(冒泡,选择,插入)中差异相对明显,改进算法中归并排序算法的效率比其他算法效率低了一个数量级,不确定是样本量小影响了归并排序效率还是代码实现问题 [^5]。也有人对排序算法进行测试,记录测试数据量分别是100、1000、10000、100000、1000000、10000000的运行时间,以研究效率高的算法是否在任何数据量下效率都高 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值