快速排序的实现

先写代码,一会再总结

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.我这种方法只能先从右往左找第一个小于分割元素的元素
不能先从左往右找第一个大于分割元素的元素
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值