话不多说先上代码
先是划分部分的代码
public List quicksort(List list) {//对传入的列表开始划分。
int mind;
List left = new ArrayList();
List right = new ArrayList();
if (list.size() < 2) {//传入一个值或者是空值就直接返回(弹出)。
return list;
} else {
mind = (int) list.get(0);
for (int i = 1; i < list.size(); i++) {//出入值大于等于两个就以中间值为基准开始划分。
if ((int)list.get(i) <= mind) {
left.add(list.get(i));//比中间值小的全放到左边。
} else {
right.add(list.get(i));//大的就放右边。
}
}
}
对于传入的列表我们先进行判断,如果元素个数是一个或者没有那这个列表就完全没有排序的必要了直接返回就可以了,剩下的情况就是元素个数在两个或两个以上了。
先把第一个元素设置为关键值(我个人喜欢叫做中间值),然后以关键值为基准进行判断,把所有小于关键值的元素全放到关键值左边,大于的就放到右边。
还有,我们对于值放到左边或者右边是否需要排好序完全不用关心,你只要放就行了。
然后是递归部分代码
List newlist = new ArrayList();//一个新的列表由左值+中值+右值所组成
newlist.addAll(quicksort(left)); //左边的所有值都比中中值小,再对每一个左值在进行一次划分,直到没有值或者只有一个值就弹出。
newlist.add(mind);//中值只是一个元素,是一个标准。
newlist.addAll(quicksort(right));//和左值一样。
递归部分的代码就是排序的主要操作员了。
首先,我们假设手里有三个元素的列表{5,2,9},然后个列表是由一个含有更多元素的列表中分出来的子列——也可以看作是原始列表的左值。将这个子列表放入newlist.addAll(quicksort(left)); 这里。这样第一步完成。
其次,程序会执行划分部分的代码在划分出两个子列表——左值和右值。
最后一定会有一个含有一个元素或者是空的列表,这时递归结束开始返回。
还是上面那三个元素,我开始划分一下,假设已经把它们放到划分代码里。
我们会得到这样的过程:left={2};mind=5;right={9}。看到这里应该会很清楚了,代码其实已经排序好了,但是我还是要运行一次,quicksort(left)会返回2,quicksort(right)会返回9,然后我们自己调整一下顺序加到一个新的列表在返回出去。
最后,一个排序好的子列表就完成了。
最后是完整代码
import java.util.ArrayList;
import java.util.List;
public class Sort {
public static void main(String arg[]) {
int[] a = {33, 55, 22, 0, 33, 77};
List list = new ArrayList();
for (int x:a){
list.add(x);
}
System.out.println(new Sort().quicksort(list));
}
public List quicksort(List list) {//对传入的列表开始划分。
int mind;
List left = new ArrayList();
List right = new ArrayList();
if (list.size() < 2) {//传入一个值或者是空值就直接返回(弹出)。
return list;
} else {
mind = (int) list.get(0);
for (int i = 1; i < list.size(); i++) {//出入值大于等于两个就以中间值为基准开始划分。
if ((int)list.get(i) <= mind) {
left.add(list.get(i));//比中间值小的全放到左边。
} else {
right.add(list.get(i));//大的就放右边。
}
}
}
List newlist = new ArrayList();//一个新的列表由左值+中值+右值所组成
newlist.addAll(quicksort(left)); //左边的所有值都比中中值小,再对每一个左值在进行一次划分,直到没有值或者只有一个值就弹出。
newlist.add(mind);//中值只是一个元素,是一个标准。
newlist.addAll(quicksort(right));//和左值一样。
return newlist;
}
}
注:快速排序里需要操作很多集合,如果使用数组将会使代码变得难以理解和复杂,因为数组长是固定不可变的,但是我们却需要一个长度最好不固定的集合。既然java有list这个对需要频繁操作集合超级友好的类,干嘛不用它呢??!!!