归并排序利用分而治之的办法将问题大化小,平均、最坏、最好时间复杂度都是O(nlogn),采用递归法:
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
- 重复步骤3直到某一指针到达序列尾
- 将另一序列剩下的所有元素直接复制到合并序列尾
递归法的Java实现如下:
1 | package com; |
由以上递归法的实现可知:大化小排序是可以并发进行的,利用多线程并发排序如下:ForkJoinTask任务排序:
ForkJoinSortTask.java:
1 | package com; |
ForkJoinSort.java:
1 | package com; |
对比以上两种排序实现,未使用多线程,排序100000个随机数大概需要5秒,利用多线程只需要200毫秒以内