数据结构与算法分析——C语言描述

P1.1 选择问题,选择出第K大的数,并画出N为不同值的运行时间,K=N/2

毕业两年半,重写排序,感觉良好。代码使用冒泡排序,库函数clock计算大致运行时间。

 1 // P1_1.cpp : Defines the entry point for the console application.
 2 //
 3 
 4 #include "stdafx.h"
 5 #include <malloc.h>
 6 #include <stdlib.h>
 7  #include <time.h> 
 8 
 9 void swap(int& a,int& b);
10 
11 int main(int argc, char* argv[])
12 {
13 
14     int N = 40000;
15     int k = N/2;
16     int i,j;
17 
18     //动态数组
19     int *dynArr = (int *)malloc(N * sizeof(int));
20     //生成随机数组
21      srand((unsigned) time(NULL));
22      //printf("%d%c", rand(),'\t');
23      for(i=0; i<N;i++)
24      {
25          dynArr[i] = rand()%100;
26          //printf("%d%c",dynArr[i],'\t');
27      }
28 
29 
30     int beginTime = clock();//计时开始
31 
32     //冒泡排序
33     int temp = 0;
34     for(i=0;i<N;i++)
35         for(j=0;j<N;j++)
36         {
37             if(dynArr[i]>dynArr[j]){    //左>右,交换
38                 swap(dynArr[i],dynArr[j]);
39             }    
40         }//第一层结束,最大数在最右
41 
42     int endTime = clock();//计时结束
43     int runningTime = endTime - beginTime;//算出来的单位是毫秒
44 
45 
46 
47     for(i=0; i<N;i++){
48     //     dynArr[i] = rand()%100;
49          //printf("%d%c",dynArr[i],'\t');
50      }
51     
52     char str1[] = "个数中第k大的数:";
53     char str2[] = "运行时间(毫秒):";
54     printf("\n%d%s%d\t",N,str1,dynArr[k]);
55 printf("\n%s%d\n",str2,runningTime);
56 
57 
58     return 0;
59 }
60 
61 void swap(int& left,int& right){
62     int temp;
63     temp = left;
64     left = right;
65     right = temp;
66 }

更改N值,来测试不同样本值的运行时间。

假如数据是学生的一个科目的考试成绩,百分制。N表示学生的个数。

N Time(ms)
0 0
50 1
100 5
500 49
1000 101
5000 272

N(万) Time(ms)
1 281
2 1109
3 2506
4 4384
5 6764
6 9747
7 13296
8 17421
9 22078
10 27307

这个网站绘制曲线图:

感觉就是个递增。其实这是假象...再看这两个小图:

             

人数是普通的递增,但是时间可不是递增,时间花费是迅速上升的。

posted @ 2015-05-30 13:38  HolyGrail  阅读(1228)  评论(0编辑  收藏  举报
设计良好的程序将用户的注意力视为有限的宝贵资源,只有在必要时才要求使用。 ——《Unix编程艺术》