先写代码,一会再总结
总结出的几个问题:
1.快排有两种实现方法:
(1)第一种如我的代码所示,从右向左找(从右想做找)的跳出条件为(i < j),并且在找到元素后立即与分割元素交换位置.看这一步
(2)第二种是从右向左找(从右想做找)的跳出条件为(i < right) right为数组边界,并且找到元素后不和分割元素交换值,而是交换左右两个找到的值.具体实现略过
2.我这种方法只能先从右往左找第一个小于分割元素的元素
不能先从左往右找第一个大于分割元素的元素
public class TestQuickSort {
public static void main(String[] args) {
int[] array = {6, 4, 5, 2, 3, 1};
for (int x : array) {
System.out.print(x + " ");
}
System.out.println();
quickSort(array, 0, array.length - 1);
for (int x : array) {
System.out.print(x + " ");
}
}
// 对分割元素左右段数组进行递归快排,直到左右数组只剩下1个元素为止,left代表数组的起始坐标,right代表数组的终点坐标
public static void quickSort(Comparable[] array, int left, int right) {
// 当left==right时,说明左边或右边的数组只剩下1个元素,跳出快排
if (left < right) {
int i = findPartition(array, left, right);
quickSort(array, left, i - 1);
quickSort(array, i + 1, right);
}
}
// 寻找并返回分割元素坐标
public static int findPartition(Comparable[] array, int left, int right) {
int i = left;
int j = right;
// 用数组第一个元素做为分割元素
Comparable partitionElement = array[left];
Comparable temp;
while (i < j) {
// 从右向左搜索第一个小于分割元素的元素,找到后交换两者的位置
// 容易知道j左移的时候 array[i]就是分割元素,同理 i 右移的时候,array[j]就是分割元素
while (i < j && array[j].compareTo(partitionElement >= 0) {
j--;
}
if (i < j) {
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
// 从左向右搜索第一个大于分割元素的元素,找到后交换两者的位置
while (i < j && array[i].comparaTo(partitionElement <= 0) {
i++;
}
if (i < j) {
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
}
总结出的几个问题:
1.快排有两种实现方法:
(1)第一种如我的代码所示,从右向左找(从右想做找)的跳出条件为(i < j),并且在找到元素后立即与分割元素交换位置.看这一步
// 从右向左搜索第一个小于分割元素的元素,找到后交换两者的位置
while (i < j && array[j].compareTo(partitionElement >= 0) {
j--;
}
if (i < j) {
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
(2)第二种是从右向左找(从右想做找)的跳出条件为(i < right) right为数组边界,并且找到元素后不和分割元素交换值,而是交换左右两个找到的值.具体实现略过
2.我这种方法只能先从右往左找第一个小于分割元素的元素
不能先从左往右找第一个大于分割元素的元素