引用:http://blog.chinaunix.net/uid-540802-id-2881055.html
以下是我用并行算法实现快速排序的类.
下面的是task
package chouy.jdk7;
1.
2.import java.util.Arrays;
3.import java.util.concurrent.RecursiveAction;
4.
5./**
6. * 并行快速排序的task<br>
7. * 算法为如果排序长度小于10,则使用JDK自带的{@link java.util.Arrays#sort(int[] a, int fromIndex, int toIndex)}方法;如果长度大于10,则用第一个数字为中间数,做快速排序.
8. * 分成前后两部分后使用并行框架并行运行.
9. *
10. * @author chouy
11. */
12.public class QuickSortTask extends RecursiveAction
13.{
14. static int THRESHOLD = 256;
15. private int[] array;
16. int start;
17. int end;
18.
19. public QuickSortTask(int[] array, int start, int end)
20. {
21. this.array = array;
22. this.start = start;
23. this.end = end;
24. }
25.
26. @Override
27. protected void compute()
28. {
29. if (end - start < THRESHOLD)
30. {
31. if (end - start == 1)
32. return;
33. Arrays.sort(array, start, end + 1);
34. }
35. else
36. {
37. int v = array[start];
38. boolean isAdd = true;
39. int i, j;
40. for (i = start, j = end; i < j;)
41. {
42. if (isAdd)
43. {
44. if (v > array[j])
45. {
46. array[i] = array[j];
47. array[j] = v;
48. isAdd = false;
49. i++;
50. }
51. else
52. {
53. j--;
54. }
55. }
56. else
57. {
58. if (v < array[i])
59. {
60. array[j] = array[i];
61. array[i] = v;
62. isAdd = true;
63. j--;
64. }
65. else
66. {
67. i++;
68. }
69. }
70. }
71. // 并行执行分成的两部分
72.
73. invokeAll(new QuickSortTask(array, start, i - 1), new QuickSortTask(array, i + 1, end));
74. }
75. }
76.}
这是快速排序的工具类,里面有main方法用来测试.
1.package chouy.jdk7;
2.
3.import java.util.Arrays;
4.import java.util.Random;
5.import java.util.concurrent.ForkJoinPool;
6.import java.util.concurrent.ForkJoinTask;
7.import java.lang.Runtime;
8.
9./**
10. * quick sort used jdk7's join
11. *
12. * @author chouy
13. */
14.public class QuickSort
15.{
16. ForkJoinPool pool;
17.
18. public static void main(String[] args)
19. {
20. QuickSort quickSort = new QuickSort();
21. int arraySize = 40;
22. int[] array = new int[arraySize];
23. Random r = new Random();
24. for (int i = 0; i < array.length; i++)
25. {
26. array[i] = r.nextInt(arraySize);
27. }
28. System.out.println(Arrays.toString(array));
29. // Arrays.sort(array, 0, array.length);
30.
31. // System.out.println(Arrays.toString(array));
32.
33. quickSort.sort(array);
34. System.out.println(Arrays.toString(array));
35. }
36.
37. public QuickSort()
38. {
39. pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors());
40. }
41.
42. public synchronized void sort(int array[])
43. {
44. ForkJoinTask<Void> job = pool.submit(new QuickSortTask(array, 0, array.length - 1));
45. job.join();
46. }
47.}
最后再提供一个junit测试类,用于测试正确性,性能等.
1.package chouy.jdk7;
2.
3.import java.util.Arrays;
4.import java.util.Random;
5.
6.import org.junit.Assert;
7.import org.junit.Before;
8.import org.junit.Test;
9.
10.public class QuickSortTest
11.{
12. QuickSort quickSort;
13.
14. @Before
15. public void setUp() throws Exception
16. {
17. quickSort = new QuickSort();
18. }
19.
20. /**
21. * 测试结果是否正确
22. */
23. @Test
24. public void testSort()
25. {
26. int arraySize = 40;
27. int[] arrayQuickSort = new int[arraySize];
28. int[] arrayArraysSort = new int[arraySize];
29. Random r = new Random();
30. for (int i = 0; i < arrayQuickSort.length; i++)
31. {
32. arrayQuickSort[i] = r.nextInt(arraySize);
33. }
34. System.arraycopy(arrayQuickSort, 0, arrayArraysSort, 0, arraySize);
35.
36. System.out.println(Arrays.toString(arrayQuickSort));
37. quickSort.sort(arrayQuickSort);
38.
39. Arrays.sort(arrayArraysSort);
40. for (int i = 0; i < arrayQuickSort.length; i++)
41. {
42. Assert.assertEquals(arrayQuickSort[i], arrayArraysSort[i]);
43. }
44. }
45.
46. /**
47. * 测试快速排序的性能与Arrays.sort()方法的比较
48. */
49. @Test
50. public void testPerformance()
51. {
52. int arraySize = 50000000;
53. int[] arrayQuickSort = new int[arraySize];
54. int[] arrayArraysSort = new int[arraySize];
55. Random r = new Random();
56. for (int i = 0; i < arrayQuickSort.length; i++)
57. {
58. arrayQuickSort[i] = r.nextInt(arraySize);
59. }
60. System.arraycopy(arrayQuickSort, 0, arrayArraysSort, 0, arraySize);
61.
62. // System.out.println(Arrays.toString(arrayQuickSort));
63.
64. System.out.println("start concurrent");
65. long start = System.currentTimeMillis();
66. quickSort.sort(arrayQuickSort);
67. long end = System.currentTimeMillis();
68. long spend1 = end - start;
69.
70. System.out.println("start system quick sort");
71. start = System.currentTimeMillis();
72. Arrays.sort(arrayArraysSort);
73. end = System.currentTimeMillis();
74. long spend2 = end - start;
75. System.out.println("concurrent: " + spend1 + ", quickSort: " + spend2);
76. }
77.
78. /**
79. * 用来测试快排方法中,被排序数组长度为5000万时,threshold值不同时运行的时间.
80. */
81. @Test
82. public void testBestThreshold()
83. {
84. int arraySize = 50000000;
85. int[] arrayQuickSort = new int[arraySize];
86. int[] arrayArraysSort = new int[arraySize];
87. Random r = new Random();
88. for (int i = 0; i < arrayQuickSort.length; i++)
89. {
90. arrayQuickSort[i] = r.nextInt(arraySize);
91. }
92. for (int i = 128; i <= arraySize; i = i * 2)
93. {
94. System.arraycopy(arrayQuickSort, 0, arrayArraysSort, 0, arraySize);
95. QuickSortTask.THRESHOLD = i;
96. System.out.print("threshold = " + i);
97. long start = System.currentTimeMillis();
98. quickSort.sort(arrayArraysSort);
99. long end = System.currentTimeMillis();
100. System.out.println(" spends " + (end - start) + " ms");
101. }
102. }
103.}
分享到:
相关推荐
2. **字符串连接优化**:在JDK1.7中,字符串连接使用了新的` StringJoiner `类,该类提高了字符串拼接的效率,尤其是在大量字符串连接时。 3. **try-with-resources语句**:这是一个新的异常处理机制,允许自动关闭...
Java JDK 1.7,全称为Java Development Kit version 7,是Oracle公司推出的Java编程语言的开发工具包,主要用于编写、编译、测试和运行Java应用程序。这个版本的JDK在2012年发布,引入了许多新特性,提升了性能,并...
Java Development Kit (JDK) 是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。 JDK 1.7,也被称为Java SE 7(Java Standard Edition 7),是Oracle公司发布的一个重要版本...
Java Development Kit (JDK) 是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具和库。"jdk1.7-linux" 指的是Oracle公司发布的针对Linux操作系统的JDK 1.7版本,也称为Java 7。...
总结,JDK 1.7是Java开发的基础,它的功能强大且全面,不仅提供了开发所需的工具,还带来了许多增强的特性,为开发者提供了更高效、更便捷的开发体验。在Windows 64位环境下,正确安装和配置JDK 1.7是进行Java开发的...
**正文** ...综上所述,JDK 1.7是一个具有诸多创新特性和性能优化的Java开发工具,其绿色版的便携性更是提升了开发者的使用体验。通过了解和掌握这些特性,开发者可以编写出更高效、更易维护的Java代码。
为了在CentOS 7上使用JDK 1.7编译OpenJDK 1.8,你需要遵循以下步骤: 1. **安装依赖**:确保系统已安装了必要的编译工具,如GCC、make等,并安装OpenJDK 1.7作为构建环境。 2. **下载源码**:获取到`jdk7u-dev-b...
Java JDK 1.7,全称为Java Development Kit 1.7,是Oracle公司推出的用于开发Java应用程序的重要工具集。这个版本在Java发展历程中扮演着重要角色,提供了许多新特性和性能优化,旨在提升开发效率和程序性能。下面将...
在这个特定的案例中,我们讨论的是"jdk1.7 64位 解压缩版",这意味着它是针对64位操作系统设计的JDK1.7版本,无需安装,只需解压即可使用。 JDK1.7,也被称为Java 7或Java SE 7(Java Standard Edition 7),是...
本资源提供的"jdk1.7-linux-x64"是Oracle JDK 1.7的64位版本,专为Linux操作系统设计,特别适合在64位Linux环境下进行Java开发工作。 JDK 1.7,也被称为Java 7,是Java平台标准版(Java SE)的一个重要版本。它在...
Java Development Kit(JDK)是Java编程语言的核心组件,它包含了编译器、调试器、Java运行时环境(JRE)以及一系列工具,使得开发者能够编写、测试和部署Java应用程序。JDK 1.7,也被称为Java 7,是Oracle公司发布...
JDK 1.7,也称为 Java 7,是 Oracle 公司提供的用于开发和运行Java应用程序的重要工具集。免安装版本,即绿色版,是不需要通过传统安装过程就可以使用的版本。这种版本通常被压缩在一个文件包里,用户只需解压缩并...
JDK1.7,全称Java Development Kit 1.7,是Oracle公司发布的一个针对Java开发者的工具集,主要用于编写、编译、测试和运行Java应用程序。这个版本的JDK专为Windows 32位操作系统设计,意味着它可以在32位的Windows...
- **动态类型语言支持**:JDK 1.7引入了类型推断(Type Inference)的概念,使得在编写泛型代码时可以使用`<>`操作符(被称为钻石操作符),简化了代码。 - **开关表达式(Switch on Strings)**:允许在switch...
JDK1.7,也称为Java SE 1.7或JDK7,是Java开发工具包的一个重要版本,对于Java开发者来说是必备的环境。它在Java发展历程中扮演了关键角色,引入了许多新特性,提升了开发效率并优化了性能。在此,我们将深入探讨JDK...
1. **动态类型语言支持**:JDK 1.7引入了Type Inference for Generic Instance Creation(类型推断),使得使用泛型更加方便,特别是对于匿名内部类和Lambda表达式。 2. **尝试-with-resources语句**:这是一个新的...
3. **字符串In-place替换**:`String`类新增了`replaceFirst()`和`replaceAll()`方法,可以在原字符串上进行替换操作,而无需创建新对象。 4. **开关语句支持字符串**:`switch`语句不再仅限于整型和枚举类型,现在...
`java.util.concurrent`包增加了新的并发工具类,提高了多线程编程的便利性。 总之,JDK 1.7 64位官方正式版是Java开发者和企业常用的开发环境,它集成了多项性能优化和新功能,为开发高质量的Java应用程序提供了...
JDK 1.7稳定版意味着它是经过广泛测试和调试的,适合生产环境使用的版本。 1. **动态类型语言支持**:Java 7引入了 invokedynamic 指令,使得运行时能够动态解析方法调用。这一特性主要是为了支持Groovy、Scala等...
**Java Development Kit (JDK) 1.7 for Windows 32位详解** JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用程序的...了解和掌握其特性和使用方法,对于理解和升级旧系统或维护遗留代码具有重要意义。