1.1 编写一个程序解决选择问题。令k = N/2。画出表格显示程序对于N种不同的值的运行时间。
- 创建随机数据代码
package unit1;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;
public class CreateData {
public static void main(String[] args) throws IOException {
int n = 10000;
Random random = new Random();
int[] datas = new int[n];
for (int i=0; i<n; i++) {
datas[i] = random.nextInt(10000000);
}
File file = new File("e:/data.dat");
FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw);
for (int i =0; i<n; i++) {
String temp = Integer.toString(datas[i])+" ";
bw.write(temp);
}
bw.flush();
bw.close();
}
}
- 排序算法代码
package unit1;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
public class Work01 {
public static void main(String[] args) throws IOException {
long startTime = System.currentTimeMillis();
File file = new File("e:/data.dat");
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
StringBuffer sb = new StringBuffer();
int content = 0;
while ((content = br.read()) != -1) {
sb.append((char)content);
}
String str = sb.toString();
String[] strs = str.split(" ");
int n = strs.length;
int[] datas = new int[n];
for (int i=0 ; i<n; i++) {
datas[i] = Integer.parseInt(strs[i]);
}
bubbleSort(datas);
long time = System.currentTimeMillis()-startTime;
System.out.println(time+" ms");
}
public static void bubbleSort(int[] arr) {
for (int i=0; i<arr.length-1; i++) {
for (int j = 0; j < arr.length-1-i; j++) {
if (arr[j] > arr[j+1]) {
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
}
测试5种数据的速度,分别是1万,2万,5万,10万, 20万
分别测3次的时间,再取平均时间。
数据量 | 1st时间 | 2nd时间 | 3rd时间 | Avg时间 |
---|---|---|---|---|
1万 | 129ms | 131ms | 132ms | 131ms |
2万 | 482ms | 486ms | 487ms | 485ms |
5万 | 3145ms | 3122ms | 3140ms | 3.1s |
10万 | 12.6s | 12.6s | 12.6s | 12.6s |
20万 | 50.2s | 50.4s | 50s | 50.2s |
可以观察到很明显的平方关系在其中,每当排序量倍数增长,所消耗的时间将会是倍数的平方。