快速排序(v 3.0)

前面选的轴为左边和中间,当然,这次的轴为数组的最右边,先看看吧。


/*
* 1, 以最右边的数s为比较的标准;
* 2, 未处理完毕的数组分为四个部分,从左到右依次为小于s的部分,大于s的部分,未比较部分和最右的s;
* 3, 小于s的部分最大下标是i;大于s的部分最大下标是j,刚开始时i为-1,j为0;
* 4, 在排序的过程中,一发现不大于s的数,i++,并将原i位置的数与新发现的数交换位置。一次循环完成后将s放到i+1的位置;
* 5, 以新s所在位置将原数组切割为两部分,进行新的递归。
*/
public static void QuickSort(int[] number)
{
QuickSort(number, 0, number.length - 1);
}

private static void QuickSort(int[] number, int left, int right)
{
if (left < right)
{
//q为新的切割点,分为大于s和小于s两个新的部分以进行递归
int q = partition(number, left, right);
//递归小于s的部分,在整个算法中,先排好左边的,再排右边的
QuickSort(number, left, q - 1);
//递归大于s的部分
QuickSort(number, q + 1, right);
}
}

private static int partition(int[] number, int left, int right)
{
int s = number[right];
int i = left - 1;

for (int j = left; j < right; j++)
{
//找出不大于s的数放在左边
if (number[j] <= s)
{
i++;
swap(number, i, j);
}
}
//找完后不大于s的数的下标已用到i,根据算法将s放到它们后面(i+1)的位置
swap(number, i + 1, right);
//返回s的位置,将原数组切分为两个新的数组,进行新的递归
return i + 1;
}

private static void swap(int[] number, int i, int j)
{
int t;
t = number[i];
number[i] = number[j];
number[j] = t;
}


小结:快速排序的效率与轴的选择有关,在这三个版本中,传说V3的效率最高,单循环+递归。这三个算法也都很好理解,我直接使用良葛格的Java代码,只是加上自己的理解作为注释,算是读书笔记吧。不当的地方请大家多多指正,不胜感激。

下面是原文链接:
http://caterpillar.onlyfun.net/GossipCN/AlgorithmGossip/QuickSort3.htm
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值