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

来源:互联网 发布:淘宝folk老王是正品吗 编辑:程序博客网 时间:2024/05/29 05:55
/*  Copyright (c).2016, 烟台大学计算机学院  All rights reserved.  文件名称:test.cpp  作    者:田艺 完成日期:2015年 9 月 8日  版 本 号:v1.0   问题描述:体验复杂度是O(n 2  )的选择排序程序和复杂度为O(nlogn) 的快速排序程序  问题输入:无 问题输出:程序运行时间  */  

下面是复杂度是O(n 2 )(备注:含有双重循环)的选择排序程序代码:

#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;  }  
运行结果:

下面是复杂度为O(nlogn)(备注:含类似阶乘运算的,例如n*(n+2)) 的快速排序程序代码:

#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;  }  ;
运行结果:


汉诺塔程序代码:

[cpp] view plain copy#include <stdio.h>  #define discCount 4  long move(int, char, char,char);  int main()  {      long count;      count=move(discCount,'A','B','C');      printf("%d个盘子需要移动%ld次\n", discCount, count);      return 0;  }    long move(int n, char A, char B,char C)  {      long c1,c2;      if(n==1)          return 1;      else      {          c1=move(n-1,A,C,B);          c2=move(n-1,B,A,C);          return c1+c2+1;      }  }  
运行结果:


学习心得:

感悟:对于复杂度,关键看程序是几重循环,计算是否用了阶乘,优化后的程序应该是复杂度小的,运行效率高的。

0 0
原创粉丝点击