优化这段代码public class QuickSort implements IArraySort { @Override public int[] sort(int[] sourceArray) throws Exception { // 对 arr 进行拷贝,不改变参数内容 int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); return quickSort(arr, 0, arr.length - 1); } private int[] quickSort(int[] arr, int left, int right) { if (left < right) { int partitionIndex = partition(arr, left, right); quickSort(arr, left, partitionIndex - 1); quickSort(arr, partitionIndex + 1, right); } return arr; } private int partition(int[] arr, int left, int right) { // 设定基准值(pivot) int pivot = left; int index = pivot + 1; for (int i = index; i <= right; i++) { if (arr[i] < arr[pivot]) { swap(arr, i, index); index++; } } swap(arr, pivot, index - 1); return index - 1; } private void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }
时间: 2023-05-12 10:04:37 浏览: 90
这段代码是快速排序的实现,可以对一个整型数组进行排序。在排序过程中,先选取一个基准值,然后将数组中小于基准值的元素放在基准值的左边,大于基准值的元素放在基准值的右边,最后递归地对左右两个子数组进行排序。这个实现中使用了递归算法,可以对较大的数组进行排序。如果数组长度较小,可以考虑使用插入排序等其他算法。
相关问题
package tiantian; public class QuickSort { public static 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); } public static void main(String[] args){ int[] arr = {10,7,4,7,3,2,1,8,9,19}; quickSort(arr, 0, arr.length-1); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }代码解释
这是一个 Java 实现的快速排序算法。快速排序是一种高效的排序算法,它的基本思想是通过分治法将一个大问题不断划分成小问题,然后递归地解决小问题,最终得到整个问题的解。
具体地,这个算法使用了一个基准值(即 temp)来将待排序数组分成两个部分,其中一部分所有元素都小于等于基准值,另一部分所有元素都大于等于基准值。然后对这两部分分别递归地进行快速排序,直到整个数组有序为止。
在代码实现中,使用了两个指针 i 和 j 来分别从左向右和从右向左遍历数组,找到需要交换的元素。具体来说,当右指针 j 指向的元素比基准值小,或者左指针 i 指向的元素比基准值大时,就停止移动指针。然后交换 i 和 j 指向的元素,将小于基准值的元素放到左边,大于基准值的元素放到右边。最后将基准值和 i 指向的元素交换位置,完成一轮划分。
这个算法的时间复杂度为 O(n log n),其中 n 是待排序数组的长度。
注释这段代码import java.util.Scanner;public class QuickSort { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] nums = new int[n]; for (int i = 0; i < n; i++) { nums[i] = sc.nextInt(); } quickSort(nums, 0, n - 1); for (int num : nums) { System.out.print(num + " "); } } private static void quickSort(int[] nums, int left, int right) { if (left >= right) { return; } int i = left, j = right; int pivot = nums[left]; while (i < j) { while (i < j && nums[j] >= pivot) { j--; } nums[i] = nums[j]; while (i < j && nums[i] <= pivot) { i++; } nums[j] = nums[i]; } nums[i] = pivot; quickSort(nums, left, i - 1); quickSort(nums, i + 1, right); }}
好的,下面是代码的注释:
```java
import java.util.Scanner;
public class QuickSort {
public static void main(String[] args) {
// 创建 Scanner 对象,用于读入数据
Scanner sc = new Scanner(System.in);
// 读入要排序的数的个数
int n = sc.nextInt();
// 创建数组,用于存储要排序的数
int[] nums = new int[n];
// 读入要排序的数
for (int i = 0; i < n; i++) {
nums[i] = sc.nextInt();
}
// 调用 quickSort 方法进行排序
quickSort(nums, 0, n - 1);
// 输出排序后的结果
for (int num : nums) {
System.out.print(num + " ");
}
}
private static void quickSort(int[] nums, int left, int right) {
// 如果左指针大于等于右指针,表示已经排好序了,直接返回
if (left >= right) {
return;
}
// 初始化左右指针和基准数
int i = left, j = right;
int pivot = nums[left];
// 双指针法,将数组分为两个部分
while (i < j) {
// 从右往左找小于基准数的数
while (i < j && nums[j] >= pivot) {
j--;
}
// 将小于基准数的数移到左边
nums[i] = nums[j];
// 从左往右找大于基准数的数
while (i < j && nums[i] <= pivot) {
i++;
}
// 将大于基准数的数移到右边
nums[j] = nums[i];
}
// 把基准数放到中间位置
nums[i] = pivot;
// 递归地对左右两部分进行排序
quickSort(nums, left, i - 1);
quickSort(nums, i + 1, right);
}
}
```
这段代码主要实现了快速排序算法,通过注释可以更好地理解代码的逻辑。其中,`main` 方法主要是读入数据,调用 `quickSort` 方法进行排序,并输出排序后的结果;`quickSort` 方法实现了快速排序算法,其中使用了双指针法来将数组分为两部分,然后递归地对这两部分进行排序。
阅读全文