我想寫希爾排序的multhithreaded版本Java的我的多線程程序出了什麼問題?
這是單線程版本
import java.util.*;
import java.util.Scanner.*;
class Test
{
public static void main (String [] args)
{
double [] list = new double [10000];
for (int i = 0; i < 10000; i++)
list[i] = 10000 - i;
long startTime = System.currentTimeMillis();
shellSort(list);
int elapsedTime = (int) (System.currentTimeMillis() - startTime);
System.out.println ("Time = " + elapsedTime);
for (double i : list)
System.out.print (i + " ");
}
public static void shellSort(double [] list)
{
int i, increment;
int [] k = {1, 4, 13, 40, 121, 364, 1093, 3280, 9841, 29524, 88573, 265720, 797161, 2391484};
for (i = k.length - 1; k[i] > list.length; i--);
for (i--; i >= 0; i--)
{
increment = k[i];
int upper = 2 * increment;
for (int count = increment; count < upper; count++)
insertionSort(list, increment, count);
}
}
public static void insertionSort(double [] list, int increment, int position)
{
for (int top = position; top < list.length;)
{
double item = list[top];
int i = top;
while (i - increment >= 0 && item < list[i - increment])
{
list[i] = list[i - increment];
i -= increment;
}
list[i] = item;
top += increment;
}
}
}
代碼這是多線程版本
import java.util.*;
import java.util.Scanner.*;
class MT extends Thread
{
double[] list;
int increment, position;
MT (double [] a, int b, int c)
{
list = a;
increment = b;
position = c;
}
public void run()
{
for (int top = position; top < list.length;)
{
double item = list[top];
int i = top;
while (i - increment >= 0 && item < list[i - increment])
{
list[i] = list[i - increment];
i -= increment;
}
list[i] = item;
top += increment;
}
}
}
class Test
{
public static void main (String [] args)
{
double [] list = new double [10000];
for (int i = 0; i < 10000; i++)
list[i] = 10000 - i;
long startTime = System.currentTimeMillis();
shellSort(list);
int elapsedTime = (int) (System.currentTimeMillis() - startTime);
System.out.println ("Time = " + elapsedTime);
for (double i : list)
System.out.print (i + " ");
}
public static void shellSort(double [] list)
{
int i, increment;
int [] k = {1, 4, 13, 40, 121, 364, 1093, 3280, 9841, 29524, 88573, 265720, 797161, 2391484};
for (i = k.length - 1; k[i] > list.length; i--);
for (i--; i >= 0; i--)
{
increment = k[i];
int upper = 2 * increment;
for (int count = increment; count < upper; count+=2)
{
new MT(list, increment, count).start();
new MT(list, increment, count + 1).start();
}
}
}
}
代碼
多線程版本比單線程版本花費的時間要長得多。兩者都提供正確的輸出,多線程版本使用我的3個內核而不是2個。什麼導致我的多線程程序放緩?我能想到的唯一的事情是,當我打電話給MT課程時,我正在創建包含數字的數組?
謝謝。
由於需要大量的同步/線程開銷,shellort算法並不特別適合並行化。 –