快速排序算法的 Java 代码实现

` /**
* 快速排序算法:每趟排序拿中间数和其它数进行比较,每趟排序结束后,左边的数都不大于中间数(不能保证左边是有序的),
* 右边的数都不小于中间数(不能保证右边是有序的),再对左右两边进行同样的操作,直到整个数组都是有序的。
* 比如有这样一个数组int[] intArray = [99, 1, 10, 3, 2, 6],
* 第一趟排序:中间数是10,因为(开始索引0 + 结束索引5) / 2 = 2,中间索引为2的数就是10,
* 先从左边向右循环比较,发现99大于10,停止循环,再从右边向左循环比较,发现6小于10,停止循环,交换99和6的位置,
* 数组变为[6, 1, 10, 3, 2, 99],继续刚才的操作,左边没有大于10的数,右边有2小于10,因为左边没有可以交换的数,
* 所以2要跟10交换,数组变为[6, 1, 2, 3, 10, 99],中间索引变成了4,中间数跟右边的数进行交换后,就只需和左边的数比较了,因为新的中间索引的右边都是比较过了并且不小于中间数,
* (同理,中间数跟左边的数进行交换后,就只需和右边的数比较了),左边从索引为3的开始比较,没有大于10的,第一趟排序结束,
* 第二趟排序:以10为中间数分为左右两部分,右边只有一个数不用再排序了,右边再重复上面的操作,直到数组有序。
*
* @param intArray 待排序的数组
* @param startIndex 待排序部分的开始索引
* @param endIndex 待排序部分的结束索引
*/
public static void quickSort(int[] intArray, int startIndex, int endIndex) {
/if (startIndex == endIndex - 1) {// 只有两个数,没有中间数
if (intArray[startIndex] > intArray[endIndex]) {
int valueOfstartIndex = intArray[startIndex];
intArray[startIndex] = intArray[endIndex];
intArray[endIndex] = valueOfstartIndex;
}
return;
}
/
int middleIndex = (startIndex + endIndex) / 2;// 中间索引
int leftIndex = startIndex, rightIndex = endIndex;
while (leftIndex < middleIndex || rightIndex > middleIndex) {
boolean leftGreaterThanMiddle = false, rightLessThanMiddle = false;
while (leftIndex < middleIndex) {
if (intArray[leftIndex] > intArray[middleIndex]) {
leftGreaterThanMiddle = true;// 左边有大于中间的数
break;
}
leftIndex++;
}
while (rightIndex > middleIndex) {
if (intArray[rightIndex] < intArray[middleIndex]) {
rightLessThanMiddle = true;// 右边有小于中间的数
break;
}
rightIndex–;
}
if (leftGreaterThanMiddle && rightLessThanMiddle) {// 左边有大于中间的数和右边有小于中间的数,交换这两个数的位置
int valueOfLeftIndex = intArray[leftIndex];
intArray[leftIndex] = intArray[rightIndex];
intArray[rightIndex] = valueOfLeftIndex;
leftIndex++;
rightIndex–;
} else if (leftGreaterThanMiddle) {// 左边有大于中间的数,右边没有小于中间的数,把左边的这个数和中间的数交换位置
int valueOfLeftIndex = intArray[leftIndex];
intArray[leftIndex] = intArray[middleIndex];
intArray[middleIndex] = valueOfLeftIndex;
middleIndex = leftIndex;
rightIndex–;
} else if (rightLessThanMiddle) {// 右边有小于中间的数,左边没有大于中间的数,把右边的这个数和中间的数交换位置
int valueOfRightIndex = intArray[rightIndex];
intArray[rightIndex] = intArray[middleIndex];
intArray[middleIndex] = valueOfRightIndex;
middleIndex = rightIndex;
leftIndex++;
}
}
if (middleIndex > startIndex) {
quickSort(intArray, startIndex, middleIndex - 1);
}
if (middleIndex < endIndex) {
quickSort(intArray, middleIndex + 1, endIndex);
}
}``

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值