<1> 实现排序方法
java 多线程代码示例 " />

Java是一种零碎的、多功能的语言,在众多场景下都能够发挥出其强大的功能。其中,排序是Java中的一个重要应用场景。Java提供了多种排序方法,而这些排序方法多数都是单线程的。但是,在某些情况下,单线程的排序可能会受限制,需要使用多线程进行排序。本文将介绍Java中的排序方法及其实现,还会详细讲解Java中多线程排序的实现方法。

排序算法简介

排序算法是计算机科学中的基础算法之一。排序算法是通过比较来把一组数据按照某种规则进行排列的算法。排序算法的效率一直是人们所关注的问题。在Java中,常见的排序算法包括以下几种:

1. 冒泡排序

冒泡排序是一种简单的排序算法,通过不断交换相邻两个元素的位置,将较大的元素逐步向右移动,实现从小到大的排序。

2. 快速排序

快速排序是一种高效的排序算法,通过将一个数组分成两个较小的数组,从而更容易进行排序。

3. 插入排序

插入排序是一种简单的排序算法,它通过对一个数组中的元素进行逐个比较和排序,从而将数据按照一定的规则进行排列。

4. 归并排序

归并排序是一种基于分治思想的排序算法,该算法通过将一个数组分成两个较小的数组,分别对其进行排序,然后将它们合并起来,以实现整体排序。

5. 堆排序

堆排序是一种基于堆的二叉树结构的排序算法,通过建立一个二叉堆来实现排序。

Java排序方法的实现

通过使用Java标准库,我们可以实现多种排序方法。Java提供了两种类型的排序方法:基于比较的排序和非比较的排序。基于比较的排序方法如快速排序、冒泡排序和归并排序等需要比较数组中元素的值来实现排序。而非比较的排序方法如计数排序和桶排序等则不依据元素之间的顺序进行排序。

下面我们将介绍Java中的基于比较的排序实现方法,这些方法包括:

1. 冒泡排序

冒泡排序的Java实现代码如下:

```

public static void bubbleSort(int[] arr) {

int len = arr.length;

for (int i = 0; i < len - 1; i++) {

for (int j = 0; j < len - i - 1; j++) {

if (arr[j] > arr[j + 1]) {

int temp = arr[j];

arr[j] = arr[j + 1];

arr[j + 1] = temp;

}

}

}

}

```

以上代码创建了一个名为”bubbleSort”的方法,使用冒泡排序法实现了对输入数组的排序操作。

2. 快速排序

快速排序的Java实现代码如下:

```

public static void quickSort(int[] arr, int low, int high) {

if (low < high) {

int i = low, j = high, pivot = arr[low];

while (i < j) {

while (i < j && arr[j] >= pivot) j--;

if (i < j) arr[i++] = arr[j];

while (i < j && arr[i] < pivot) i++;

if (i < j) arr[j--] = arr[i];

}

arr[i] = pivot;

quickSort(arr, low, i - 1);

quickSort(arr, i + 1, high);

}

}

```

以上代码创建了一个名为”quickSort”的方法,使用快速排序法实现了对输入数组的排序操作。

3. 插入排序

插入排序的Java实现代码如下:

```

public static void insertionSort(int[] arr) {

int len = arr.length;

for (int i = 1; i < len; i++) {

int key = arr[i];

int j = i - 1;

while (j >= 0 && arr[j] > key) {

arr[j + 1] = arr[j];

j--;

}

arr[j + 1] = key;

}

}

```

以上代码创建了一个名为”insertionSort”的方法,使用插入排序法实现了对输入数组的排序操作。

4. 归并排序

归并排序的Java实现代码如下:

```

public static void mergeSort(int[] arr, int low, int high) {

if (low < high) {

int mid = (low + high) / 2;

mergeSort(arr, low, mid);

mergeSort(arr, mid + 1, high);

merge(arr, low, mid, high);

}

}

private static void merge(int[] arr, int low, int mid, int high) {

int i = low, j = mid + 1, k = 0;

int[] temp = new int[high - low + 1];

while (i <= mid && j <= high) {

if (arr[i] < arr[j]) {

temp[k++] = arr[i++];

} else {

temp[k++] = arr[j++];

}

}

while (i <= mid) temp[k++] = arr[i++];

while (j <= high) temp[k++] = arr[j++];

System.arraycopy(temp, 0, arr, low, temp.length);

}

```

以上代码创建了一个名为”mergeSort”的方法,使用归并排序法实现了对输入数组的排序操作。

5. 堆排序

堆排序的Java实现代码如下:

```

public static void heapSort(int[] arr) {

int len = arr.length;

for (int i = len / 2 - 1; i >= 0; i--)

heapify(arr, len, i);

for (int i = len - 1; i >= 0; i--) {

int temp = arr[0];

arr[0] = arr[i];

arr[i] = temp;

heapify(arr, i, 0);

}

}

private static void heapify(int[] arr, int n, int i) {

int largest = i;

int l = 2 * i + 1;

int r = 2 * i + 2;

if (l < n && arr[l] > arr[largest])

largest = l;

if (r < n && arr[r] > arr[largest])

largest = r;

if (largest != i) {

int temp = arr[i];

arr[i] = arr[largest];

arr[largest] = temp;

heapify(arr, n, largest);

}

}

```

以上代码创建了一个名为”heapSort”的方法,使用堆排序法实现了对输入数组的排序操作。

多线程排序的实现

在某些情况下,使用一般的单线程排序算法会因为计算量过大而效率降低。这时,我们可以使用多线程排序的方法,提高排序的效率。

Java中实现多线程排序的方法包括:

1. 使用Fork/Join框架

Fork/Join框架是Java5中引入的一种用于并行执行任务的框架,包括一个ForkJoinPool和ForkJoinTask等类,能够提高执行速度。在使用Fork/Join框架时,需要继承RecursiveTask类或RecursiveAction类,并重写compute()方法,并使用ForkJoinPool实现线程的管理。

下面是使用Fork/Join框架实现的快速排序多线程排序的代码:

```

import java.util.concurrent.ForkJoinPool;

import java.util.concurrent.RecursiveTask;

public class ParallelQuickSorter extends RecursiveTask {

private static final int CUTOFF = 100;

private final int[] array;

private final int leftInclusive;

private final int rightExclusive;

public ParallelQuickSorter(int[] array) {

this(array, 0, array.length);

}

private ParallelQuickSorter(int[] array, int leftInclusive, int rightExclusive) {

this.array = array;

this.leftInclusive = leftInclusive;

this.rightExclusive = rightExclusive;

}

@Override

protected int[] compute() {

int length = rightExclusive - leftInclusive;

if (length <= CUTOFF) {

ArrayUtils.quickSort(array, leftInclusive, rightExclusive - 1);

return array;

}

int pivotIndex = ArrayUtils.partition(array, leftInclusive, rightExclusive);

ParallelQuickSorter leftTask =

new ParallelQuickSorter(array, leftInclusive, pivotIndex);

ParallelQuickSorter rightTask =

new ParallelQuickSorter(array, pivotIndex + 1, rightExclusive);

leftTask.fork();

int[] rightResult = rightTask.compute();

int[] leftResult = leftTask.join();

System.arraycopy(leftResult, 0, array, leftInclusive, leftResult.length);

System.arraycopy(rightResult, 0, array, pivotIndex + 1, rightResult.length);

return array;

}

public static void main(String[] args) {

int[] arr = { 5, 3, 7, 8, 1, 9 };

ForkJoinPool pool = new ForkJoinPool();

pool.invoke(new ParallelQuickSorter(arr));

ArrayUtils.printArray(arr);

}

}

```

以上代码使用了Fork/Join框架实现了一个快速排序的多线程排序程序。

2.使用Java线程池

Java线程池在多线程任务中发挥重要作用。通过创建一个线程池,可以轻松地管理多个线程。我们可以使用Java线程池来并行执行多线程排序程序。使用Java线程池时,需要创建一个线程池对象,使用submit()方法提交任务,然后使用shutdown()方法关闭线程池。

下面是使用Java线程池实现的并行排序的代码:

```

import java.util.concurrent.*;

public class ParallelSorter {

private final ExecutorService pool;

static final int THREAD_NUM = 5; //线程数

public ParallelSorter() {

pool = Executors.newFixedThreadPool(THREAD_NUM);

}

public int[] sort(int[] arr) throws InterruptedException, ExecutionException {

int len = arr.length;

int[] result = new int[len];

Future[] futures = new Future[THREAD_NUM];

int start, end, batch = len / THREAD_NUM;

for (int i = 0; i < THREAD_NUM; i++) {

start = batch * i;

end = i == THREAD_NUM - 1 ? len : batch * (i + 1);

futures[i] = pool.submit(new Sorter(arr, start, end));

}

for (int i = 0; i < THREAD_NUM; i++) {

System.arraycopy(futures[i].get(), 0, result, (len / THREAD_NUM) * i, futures[i].get().length);

}

return mergeSort(result, 0, len - 1);

}

//多线程排序

public static class Sorter implements Callable {

final int[] arr;

final int left, right;

public Sorter(int[] arr, int left, int right) {

this.arr = arr;

this.left = left;

this.right = right;

}

@Override

public int[] call() throws Exception {

return mergeSort(arr, left, right);

}

}

//归并排序

public static int[] mergeSort(int[] arr, int left, int right) {

if (left < right) {

int mid = (left + right) / 2;

mergeSort(arr, left, mid);

mergeSort(arr, mid + 1, right);

int[] tmp = new int[right - left + 1];

int i = left, j = mid + 1, k = 0;

while (i <= mid && j <= right) {

if (arr[i] <= arr[j]) {

tmp[k++] = arr[i++];

} else {

tmp[k++] = arr[j++];

}

}

while (i <= mid) {

tmp[k++] = arr[i++];

}

while (j <= right) {

tmp[k++] = arr[j++];

}

System.arraycopy(tmp, 0, arr, left, k);

}

return arr;

}

public static void main(String[] args) throws Exception {

int[] arr = {5, 3, 7, 8, 1, 9};

ParallelSorter sorter = new ParallelSorter();

int[] result = sorter.sort(arr);

ArrayUtils.printArray(result);

}

}

```

以上代码使用了Java线程池实现了一个多线程排序程序。

总结

通过本文的介绍,我们了解了Java中排序算法的概念和实现方式,并讨论了如何在Java中使用多线程实现排序。在实际操作中,我们可以根据实际情况灵活选择排序算法和线程实现方式,实现高效的排序操作。

壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。

我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!

点赞(110) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部