VC6.0做了什么,使得效率低了下来
写了一个快排算法
然后进行了一些修改,随机的选择中轴元素,随机化处理了一下。
对两个算法进行比较,随机产生553k的数据进行排序,分别统计花费的时间。
一开始在windows下,直接 cl 进行编译链接,可执行文件112k,输出分别是 31ms和110ms。
后来偶然使用VC6编译,运行,可执行文件544k,大了432k,输出为94ms和171ms,分别慢了3倍和60+ms。
VS到底做了什么使得效率低了下来??!!
另外还有一个发现,在数据比较多,随机化处理过的快排算法要比没有处理的快排效率要差很大。印象中好像是应该反过来,期望运行时间应该要优于后者,因为快排的最好的情况下才是O(n*lgn),而随机化处理过之后期望运行时间是O(n*lgn)。
或者是因为多了随机化操作、数据交换操作和过程调用时间消耗而引起的?
---------------------------------------------------------code-----------------------------------------------------------------
1 #include<iostream>
2 #include<cassert>
3 #include<ctime>
4 #include<cstdlib>
5 using namespace std;
6 void quickSort(int arr[],int p,int r);
7 int Partition(int arr[],int p,int r);
8 void random_QuickSort(int arr[],int p,int r);
9 int random_Partition(int arr[],int p,int r);
10 inline void swap(int &a,int &b);
11 void writeFile(string file_name);
12 void readFile(string file_name,int arr[],int size);
13 void writeToFile(string file_name,int arr[],int size);
14 int main()
15 {
16 /*int i=-1;
17 int size=-1;
18 int *arr=NULL;
19 cin>>size;
20 arr=new int[size];
21 for(i=0;i<size;i++)
22 {
23 cin>>arr[i];
24 }
25 quickSort(arr,0,size-1);
26 for(i=0;i<size;i++)
27 cout<<arr[i]<<" ";
28
29 delete []arr;*/
30 const int size=100000;
31 int arr[size];
32 int arr2[size];
33
34 string in_file="dataIn.txt";
35 string out_file="dataOut.txt";
36 string out2_file="dataOut2.txt";
37
38 writeFile(in_file);
39 readFile(in_file,arr,size);
40 readFile(in_file,arr2,size);
41
42 clock_t start=clock();
43 quickSort(arr,0,size-1);
44 clock_t end=clock();
45 double diff=(double)(end-start);
46 cout<<diff<<endl;
47 clock_t start2=clock();
48 // insert_sort_rec(arr2,size-1);
49 random_QuickSort(arr2,0,size-1);
50 clock_t end2=clock();
51 double diff2=(double)(end2-start2);
52 cout<<diff2<<endl;
53
54 writeToFile(out_file,arr,size);
55 writeToFile(out2_file,arr2,size);
56 return 0;
57 }
58 void quickSort(int arr[],int p,int r)
59 {
60 if(p<r)
61 {
62 int q=Partition(arr,p,r);
63 quickSort(arr,p,q-1);
64 quickSort(arr,q+1,r);
65 }
66 }
67 void random_QuickSort(int arr[],int p,int r)
68 {
69 if(p<r)
70 {
71 int q=random_Partition(arr,p,r);
72 random_QuickSort(arr,p,q-1);
73 random_QuickSort(arr,q+1,r);
74 }
75 }
76 int Partition(int arr[],int p,int r)
77 {
78 int key=arr[r];
79 int i=p-1;
80 int j=p;
81 for(j=p;j<r;j++)
82 {
83 if(arr[j]<=key)
84 {
85 i++;
86 swap(arr[i],arr[j]);
87 }
88 }
89 swap(arr[i+1],arr[r]);
90 return i+1;
91 }
92 int random_Partition(int arr[],int p,int r)
93 {
94 srand(time(NULL));
95 int rd=rand()%(r-p+1)+p;
96
97 swap(arr[rd],arr[r]);
98
99 return Partition(arr,p,r);
100 }
101 inline void swap(int &a,int &b)
102 {
103 int tmp=a;
104 a=b;
105 b=tmp;
106 }
107 void writeFile(string file_name)
108 {
109 int i=0;
110 FILE *fp;
111 fp=fopen(file_name.c_str(),"w");
112 if(!fp)
113 {
114 cerr<<"failed to open file"<<endl;
115 exit(-1);
116 }
117
118 srand(time(0));
119
120 while((i++)<100000)
121 {
122 fprintf(fp,"%d ",rand()%100);
123 }
124 fclose(fp);
125 }
126 void readFile(string file_name,int arr[],int size)
127 {
128 FILE *fp=fopen(file_name.c_str(),"r");
129
130 assert(fp!=NULL);
131 for(int i=0;i<size;i++)
132 fscanf(fp,"%d",&arr[i]);
133 fclose(fp);
134 }
135 void writeToFile(string file_name,int arr[],int size)
136 {
137 FILE *fp=fopen(file_name.c_str(),"w");
138 assert(fp!=NULL);
139 for(int i=0;i<size;i++)
140 fprintf(fp,"%d ",arr[i]);
141 fclose(fp);
142
143 }
144 void insert_sort_rec(int array[],int size)
145 {
146 if(size>3)
147 insert_sort_rec(array,size-1);
148
149 int i=size-1;
150 int key;
151 key=array[i];
152 i--;
153 while(i>=0 && array[i]>key)
154 {
155 array[i+1]=array[i--];
156 }
157 array[i+1]=key;
158 }
浙公网安备 33010602011771号