第二周项目3-体验复杂度

来源:互联网 发布:年度网络新词 编辑:程序博客网 时间:2024/05/29 08:35
/*    
*    Copyright (c)2016,烟台大学计算机与控制工程学院    
*    All rights reserved.    
*    文件名称:项目3体验复杂度.cpp    
*    作        者:林颖  
*    完成日期:2015年9月11日    
*       
*        
*    问题描述:排序是计算机科学中的一个基本问题,产生了很多种适合不同情况下适用的算法,  
*                       也一直作为算法研究的热点。本项目提供两种排序算法,复杂度为O(n2)的选择排序selectsort,  

*                       和复杂度为O(nlogn)的快速排序quicksort,在main函数中加入了对运行时间的统计。    

*   输入描述:从文件中读取大量的数据 。  

*    程序输出:需要时及时的完整的进行 调用。   

 */ 

(1)复杂度是O(n2)的选择排序程序:

   #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");    
        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;    
    }    

运行结果:


(2)复杂度为O(nlogn)的快速排序程序:

#include <stdio.h>  
#include <time.h>  
#include <stdlib.h>  
#define MAXNUM 100000  
void quicksort(int data[],int first,int last)  
{  
    int i, j, t, base;  
    if (first>last)  
        return;  
    base=data[first];   
    i=first;  
    j=last;  
    while(i!=j)   
    {  
        while(data[j]>=base && i<j)   
            j--;  
        while(data[i]<=base && i<j)   
            i++;  
        /*交换两个数*/  
        if(i<j)  
        {  
            t=data[i];  
            data[i]=data[j];  
            data[j]=t;  
        }  
    }  
    data[first]=data[i];   
    data[i]=base;   
    quicksort(data,first,i-1);  
    quicksort(data,i+1,last);   
}  
  
int main()  
{  
    int x[MAXNUM];  
    int n = 0;  
    double t1,t2;  
    FILE *fp;  
    fp = fopen("numbers.txt", "r");  
    while(fscanf(fp, "%d", &x[n])!=EOF)  
        n++;  
    printf("数据量:%d, 开始排序....", n);  
    t1=time(0);  
    quicksort(x, 0, n-1);  
    t2=time(0);  
    printf("用时 %d 秒!", (int)(t2-t1));  
    fclose(fp);  
    return 0;  
}  

运行结果:


知识点总结:经过这一次的程序运行可知,复杂度为O(n^2)的selectsort程序运行实践远远大于复杂度为O(nlogn)的程序quicksort,在数据很大的情况下,符合n^2函数的值大于nlogn的值。所以,在大量数据的储存中,进行O(nlogn)的数据储存比较好一点。

学习心得:

1.在做实践项目的时候一定要细心特别注意文件夹的名称,注意要把该文件放在与源文件相同的文件夹中。

2.了解复杂度的概念。

3.了解各个算法的复杂度,从而让一些算法的运行和选择更加方便。

4.在编程序之前,找到一个好的算法可以节省很多的实行时间以及储存空间。

0 0