快排过程:定义一个基数,将小于基数的值放于左边,大于基数的值放于右边。
- 详细代码:
package rank;
import java.util.ArrayList;
public class Speed {// 快速排序
public static void main(String[] args) {
ArrayList<Integer> integerList = new ArrayList<Integer>();// 这里使用的是集合
integerList.add(7);
integerList.add(4);
integerList.add(8);
integerList.add(6);
integerList.add(9);
integerList.add(2);
integerList.add(1);
int left = 0;
int right = integerList.size() - 1;
printList(integerList);
quickRank(integerList, left, right);
printList(quickRank(integerList, left, right));
}
public static ArrayList<Integer> quickRank(ArrayList<Integer> list, int left, int right) {
if (left >= right) {// 递归 结束条件
return list;
}
int mid = getList(list, left, right);
quickRank(list, left, mid);// 递归,将前面基数左边的值在进行排序
quickRank(list, mid + 1, right);// 不加1 还是原先的数为基数不会进行排序
return list;
}
public static int getList(ArrayList<Integer> list, int left, int right) {// left
// 为最左边的下标
// right同理
int base = list.get(left);// 获取基数
while (left != right) {// 当2个下标重叠时,则本次排列结束
while (left < right && list.get(right) > base) {// 条件1
// left不能大于right,找到的数大于基数
// 则继续找
right--;// 从右边往左 找出小于基数的值,找到第一个为止
}
list.set(left, list.get(right));// 将找到的值赋予left对应的值
while (left < right && list.get(left) < base) {// 条件1
// left不能大于right,找到的数小于基数
// 则继续找
left++;// 从左边往右 找出大于基数的值,找到第一个为止
}
list.set(right, list.get(left));// 将找到的值赋予right对应的值
}
list.set(left, base);// 将left下标的值替换为基数
return left;// 第一次排序完成,返回一个下标重叠值
}
public static void printList(ArrayList<Integer> list) {
for (Integer i : list) {
System.out.print(i);
System.out.print(" ");
}
System.out.println();
}
public static ArrayList<Integer> speedRank(ArrayList<Integer> list, int left, int right) {// 同样的思路,在一个方法里写,代码比较混乱
// 无视。
if (left >= right) {
return list;
}
int base = list.get(left);
int originLeft = left;
int originRight = right;
int number;
while (right != left) {
while (left < right && list.get(right) >= base) {
right--;// 如果大于 则不符合
}
while (left < right && list.get(left) <= base) {
left++;// 大于base 不符合继续找
}
if (left < right) {// 位置调换
number = list.get(left);
list.set(left, list.get(right));
list.set(right, number);
}
}
list.set(originLeft, list.get(left));// 调换base 跟left的值
list.set(left, base);
System.out.println(left + "==" + right + "--" + list.size());
if (left == 5) {
System.out.println();
}
list = speedRank(list, originLeft, left);
list = speedRank(list, left + 1, originRight);
return list;
}
}