前兩篇分別對直接插入排序和希爾排序分別進行了瞭解,本篇則分別利用隨機值賦值的方式對兩個排序進行比較,代碼先賦值如下:
直接插入排序代碼:
public static void main(String[] args) {
Test2 test2 = new Test2();
int[] array=new int[10];
//隨機數賦值,只考慮隨機時間
for (int i=0;i<array.length;i++){
array[i]= (int) (Math.random()*1000);
}
long start1 = System.currentTimeMillis();
test2.insertSort(array);
System.out.println("insert sort time: " + (System.currentTimeMillis() - start1));
System.out.println(array.length);
}
void insertSort(int[] array) {
//定義的臨時變量
int tempRecord;
//i從1開始的原因是j=j-1
for (int i = 1; i < array.length; i++) {
tempRecord = array[i];
int j = i - 1;
//j不能爲負數,根據索引判定值大小,通過臨時變量進行交換
while (j >= 0 && tempRecord < array[j]) {
array[j + 1] = array[j];
j = j - 1;
}
array[j + 1] = tempRecord;
}
}
shell排序代碼:增量爲每次除以2
public static void main(String[] args) {
int[] array=new int[10];
for (int i=0;i<array.length;i++){
array[i]= (int) (Math.random()*1000);
}
long start1 = System.currentTimeMillis();
ShellSort2 shellSort = new ShellSort2();
shellSort.shellSort(array);
System.out.println("shell sort time: " + (System.currentTimeMillis() - start1));
System.out.println(array.length);
}
void shellSort(int[] array) {
int delta;
int n = array.length;
for (delta = n / 2; delta > 0; delta /= 2) {
int tempRecord = 0;
for (int i = delta; i < array.length; i++) {
tempRecord = array[i];
int j = i;
while (j > delta - 1 && tempRecord < array[j - delta]) {
array[j] = array[j - delta];
j -= delta;
}
array[j] = tempRecord;
}
}
}
shell排序代碼:增量爲每次除以3
public static void main(String[] args) {
int[] array=new int[10];
for (int i=0;i<array.length;i++){
array[i]= (int) (Math.random()*1000);
}
long start1 = System.currentTimeMillis();
ShellSort2 shellSort = new ShellSort2();
shellSort.shellSort(array);
System.out.println("shell sort time: " + (System.currentTimeMillis() - start1));
System.out.println(array.length);
}
void shellSort(int[] array) {
int delta;
int n = array.length;
for (delta = n / 3; delta > 0; delta /= 3) {
int tempRecord = 0;
for (int i = delta; i < array.length; i++) {
tempRecord = array[i];
int j = i;
while (j > delta - 1 && tempRecord < array[j - delta]) {
array[j] = array[j - delta];
j -= delta;
}
array[j] = tempRecord;
}
}
}
最後運行時間見如下表格:
sort | 10 | 100 | 10000 | 100000 | 1000000 | 10000000 |
---|---|---|---|---|---|---|
直接插入排序 | 0(ms) | 0(ms) | 4(ms) | 21(ms) | 1279(ms) | 99052(ms) |
shell排序,增量爲2 | 0 | 1 | 1 | 6 | 33 | 177 |
shell排序,增量爲3 | 0 | 0 | 1 | 5 | 19 | 158 |
通過對比可得結論:對於shell排序這個專門針對直接插入而誕生的排序而言,其速度確實是快樂許多。