java的快速排序怎么写?
时间: 2023-08-31 15:20:24 浏览: 49
### 回答1:
快速排序是一种分治算法,它将一个数组分成两个部分,其中一部分的所有元素都比另一部分的所有元素小。它的基本思想是:选择一个基准元素,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
下面是Java实现的快速排序代码:
public void quickSort(int[] arr, int low, int high) {
int i, j, temp, t;
if (low > high) {
return;
}
i = low;
j = high;
//temp就是基准位
temp = arr[low];
while (i < j) {
//先看右边,依次往左递减
while (temp <= arr[j] && i < j) {
j--;
}
//再看左边,依次往右递增
while (temp >= arr[i] && i < j) {
i++;
}
//如果满足条件则交换
if (i < j) {
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
//最后将基准为与i和j相等位置的数字交换
arr[low] = arr[i];
arr[i] = temp;
//递归调用左半数组
quickSort(arr, low, j - 1);
//递归调用右半数组
quickSort(arr, j + 1, high);
}
### 回答2:
快速排序是一种常用的排序算法,使用递归来实现。下面是一种基于Java的快速排序实现:
```java
public class QuickSort {
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
int pivotIndex = partition(arr, low, high); // 找到基准元素的位置
quickSort(arr, low, pivotIndex - 1); // 递归排序左子数组
quickSort(arr, pivotIndex + 1, high); // 递归排序右子数组
}
}
private static int partition(int[] arr, int low, int high) {
int pivot = arr[low]; // 选择第一个元素作为基准元素
while (low < high) {
while (low < high && arr[high] >= pivot) {
high--;
}
arr[low] = arr[high]; // 将比基准元素小的元素放到低位
while (low < high && arr[low] <= pivot) {
low++;
}
arr[high] = arr[low]; // 将比基准元素大的元素放到高位
}
arr[low] = pivot; // 将基准元素放到合适的位置
return low;
}
public static void main(String[] args) {
int[] arr = {10, 7, 8, 9, 1, 5};
int n = arr.length;
quickSort(arr, 0, n - 1);
System.out.println("排序后的数组:");
for (int i : arr) {
System.out.print(i + " ");
}
}
}
```
上述代码中,`quickSort`方法用于将指定范围的数组进行快速排序。它首先调用`partition`方法,找到基准元素的位置,然后递归调用`quickSort`对左右两个子数组进行排序。`partition`方法用于将数组划分为两部分,左侧的元素小于基准元素,右侧的元素大于基准元素,并返回基准元素的位置。
在`main`方法中,我们定义了一个测试数组,并对其使用`quickSort`方法进行排序。最后,我们打印出排序后的数组。
### 回答3:
Java的快速排序算法实现如下:
1. 首先需要定义一个快速排序函数,接收一个整数数组和数组的起始索引和结束索引作为参数:
```
public static void quickSort(int[] arr, int low, int high)
```
2. 在函数中,我们选择一个枢纽元素(pivot)作为参照点。可以选择数组中任意一个元素作为枢纽元素,常用的方法是选择待排序数组的起始位置(arr[low])或结束位置(arr[high])作为枢纽元素。
3. 接下来,我们需要将枢纽元素放置在正确的位置上,使得枢纽元素左边的元素都小于它,右边的元素都大于它。这一步称为分区(partition)操作。
```
int pivot = arr[low]; // 选择arr[low]作为枢纽元素
int i = low; // 左指针
int j = high; // 右指针
while (i < j) {
// 从右向左,找到第一个小于pivot的元素
while (i < j && arr[j] >= pivot) {
j--;
}
// 将该元素放置在枢纽元素的左边
arr[i] = arr[j];
// 从左向右,找到第一个大于pivot的元素
while (i < j && arr[i] <= pivot) {
i++;
}
// 将该元素放置在枢纽元素的右边
arr[j] = arr[i];
}
// 将枢纽元素放置在正确的位置上
arr[i] = pivot;
```
4. 分区操作完成后,枢纽元素已经在正确的位置上,此时可以将数组分割成两部分,分别对左半部分和右半部分执行快速排序。
```
quickSort(arr, low, i - 1); // 对枢纽元素左边的子数组进行快速排序
quickSort(arr, i + 1, high); // 对枢纽元素右边的子数组进行快速排序
```
5. 最后,我们只需调用快速排序函数即可完成排序。
```
int[] arr = {5, 2, 8, 9, 1};
quickSort(arr, 0, arr.length - 1);
```
这样,数组arr就会按照从小到大的顺序进行排序。快速排序算法的时间复杂度为O(nlogn),是一种高效的排序算法。