java快排原理_快速排序 java实现 (原理-优化) 三路快排

一、基本的快速排序

在数组中选取一个元素为基点,然后想办法把这个基点元素移动到它在排好序后的最终位置,使得新数组中在这个基点之前的元素都小于这个基点,而之后的元素都大于这个基点,然后再对前后两部分数组快速排序,直到数组排序完成。

cbec8f419e986d5df6f331877762a385.png

代码实现:

public void quickSorted ( int arr[] ) {

int n = arr.length - 1; // 闭区间 [0...n]

__quickSorted (arr, 0, n);

}

private __quickSorted( int arr[], int L, int R) {

if ( (L >= R) {

return;

}

// 将基点移动到最终位置的方法

int p = __partioner(arr, L, R);

// 递归拆分数组

__quickSorted(arr, L, p - 1);

__quickSorted(arr, p + 1, R);

}

那么最大的问题就是怎么把这个基点移动到它最终应该所在的位置。

d2ee36545473c46b64948857ea28be0a.png

代码实现:

private int __partioner ( int arr[], int L, int R ) {

int v = arr[L];

// [L + 1, j] < v ; [j + 1, i) > v;

int j = L;

for ( int i = L + 1; i <= R; i++ ) {

if ( arr[i] < v) {

// 交换 arr[i] 和 arr [j + 1]

int tmp = arr[j + 1];

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

arr[i] = tmp;

j++;

}

}

// 交换 arr[j] 和arr[L]

int tmp = arr[j];

arr[j] = arr[L];

arr[L] = tmp;

return j;

}

最终实现:

public void quickSorted ( int arr[] ) {

int n = arr.length - 1; // 闭区间 [0...n]

__quickSorted (arr, 0, n);

}

private __quickSorted( int arr[], int L, int R) {

if ( (L >= R) {

return;

}

// 将基点移动到最终位置的方法

int p = __partioner(arr, L, R);

// 递归拆分数组

__quickSorted(arr, L, p - 1);

__quickSorted(arr, p + 1, R);

}

private int __partioner ( int arr[], int L, int R ) {

int v = arr[L];

// [L +

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值