问题遇到的现象和发生背景
对插入排序和希尔排序进行同样的10万次测试,插入排序耗时约19s,希尔排序耗时约30s
插入排序代码:
public static void insertionSort(int[]arr){
if (arr == null || arr.length == 0) return;
int N = arr.length-1;
for (int i = 0; i < N; i++) {
for (int j = i+1; j > 0; j--) {
if (arr[j] < arr[j-1]){
swap(arr,j,j-1);
}
}
}
}
希尔排序代码:
public static void shellSort(int[]arr){
if (arr == null || arr.length < 2 ) return;
int N = arr.length;
int h = N/2;
while(h >= 1){
for (int i = h; i <N; i ++){
for (int j = i; j>= h; j-=h){
if (arr[j] <arr[j-h]){
swap(arr,j,j-h);
}
}
}
h /= 2;
}
测试insertionSort
public static void main(String[] args) {
int testTime = 100000;
int maxSize = 1000, maxvale = 200;
System.out.println("开始测试insertionSort");
Long start = System.currentTimeMillis();
for (int i = 0; i < testTime; i++) {
int[]arr = generateRandomArr(maxSize,maxvale);
int[] copyArr1 = copyArr(arr);
int[] copyArr2 = copyArr(arr);
Arrays.sort(copyArr2);
Sort.insertionSort(copyArr1);
for (int i1 = 0; i1 < arr.length; i1++) {
if (copyArr1[i1] != copyArr2[i1]) {
System.out.println("出错啦");
System.out.println("originArr = "+ Arrays.toString(arr));
System.out.println("Arrays.sort = "+ Arrays.toString(copyArr2));
System.out.println("afterSort = "+ Arrays.toString(copyArr1));
break;
}
}
}
System.out.println("测试结束");
long time = System.currentTimeMillis()-start;
System.out.println("测试用时: " + time);
}
public static void main(String[] args) {
int testTime = 100000;
int maxSize = 1000, maxvale = 200;
System.out.println("开始测试shellSort");
Long start = System.currentTimeMillis();
for (int i = 0; i < testTime; i++) {
int[]arr = generateRandomArr(maxSize,maxvale);
int[] copyArr1 = copyArr(arr);
int[] copyArr2 = copyArr(arr);
Arrays.sort(copyArr2);
ShellSort.shellSort(copyArr1);
for (int i1 = 0; i1 < arr.length; i1++) {
if (copyArr1[i1] != copyArr2[i1]) {
System.out.println("出错啦");
System.out.println("originArr = "+ Arrays.toString(arr));
System.out.println("Arrays.sort = "+ Arrays.toString(copyArr2));
System.out.println("afterSort = "+ Arrays.toString(copyArr1));
break;
}
}
}
System.out.println("测试结束");
long time = System.currentTimeMillis()-start;
System.out.println("测试用时: " + time);
}
操作环境、软件版本等信息
win10,IntelliJ Idea