快速排序
思路:
在一个序列中,随意取一个数值作为标准,将序列划分为两部分,左边一部分是小于这个标准值的,右边一部分是大于这个标准值的。
后序接着如此排序,直至序列排好序为止。
下标为0的位置是监视哨,也就是存放标准的位置。然后从j所指向的位置向前查找,只要是比49小的值就放在前面,这里27小于49,那么将27移到前面。将27存放到元素指向的位置。
接着i向后移动,38小于49,那么不变,65大于49,所以将65移动到27的位置,因为27刚才移动到了i元素的位置,现在27这个位置是空的。所以可以存放。
当 i 和 j 相等的时候,就将标准值存放在这个空的位置。
一趟快速排序就结束了。
从前往后找大的,从后往前找小的。直到 i 不小于 j 的时候。此趟快速排序结束。
Java实现代码
package com.xingyun.paixu;
/**
* 快速排序
*
* @author lenovo
*
*/
public class KuaiSuPaiXu {
public static void main(String[] args) {
// 定义将要进行排序的序列
int[] stu = { 49, 38, 65, 97, 76, 13, 27, 49 };
// 调用快速排序算法
KuaiPai(stu, 0, stu.length - 1);
for (int m : stu) {
System.out.print(m + "\t");
}
}
public static void KuaiPai(int[] stu, int l, int h) {
// 如果排序的起始下标已经大于或等于终止下标,那么说明已经排序完毕
if (l < h) {
// 获得本次排序后的序列的分界线
int k = KuaiPai01(stu, l, h);
// 左半部分进行排序
KuaiPai(stu, l, k - 1);
// 有半部分进行排序。
KuaiPai(stu, k + 1, stu.length - 1);
}
}
// 快速排序的主要实现方法。i为每趟排序的初值,j为每趟排序的终止(都是在数组长度范围内的值)
public static int KuaiPai01(int[] stu, int i, int j) {
// 将当前下标为i的数组元素的值作为标准,也就是每一次要进行快速排序的数组的第一个元素。
int k = stu[i];
// 当起始位置>=终止位置的时候,说明此趟排序已经结束
while (i < j) {
//里面两个的条件都有i<j,因为内部都在改变这两个变量
// 从后向前找,先找最后一个元素,判断是否小于标准值,
while (i<j&&stu[j] >= k) {
j--;
}
// 跳出循环说明找到了比标准值小的值,或者查找结束,
// 如果小于标准值,将该值直接放置在标准值所在的位置上,因为标准值已经存放在k中,不怕被覆盖
stu[i] = stu[j];
// 从前向后找,判断是否大于标准值,因为上面的while循环会改变j的值,所以此处应该再次判断i和j的情况
while (i < j && stu[i] <= k) {
i++;
}
// 跳出循环说明找到了比标准值大的值,或者查找结束,
// 就应该移动到上面j元素的位置,因为j元素语句移动到了标准值存放的位置了,所以可以直接覆盖
stu[j] = stu[i];
}
// 最后将k中记录的标准值移入数组中最后一次被移走的下标为i的数组空间。
stu[i] = k;
// 返回本趟排序结束时标准值的位置,序列的分界线。
return i;
}
}