二种JAVA快速排序算法比较
public class QCTest {
public static void main(String[] args) {
List<Integer> l1 = Arrays.asList(45,671,9,5,3,7,0,12,2000,34,56,45,21);
l1 = QCTest.seq1(l1);
System.out.println(l1);
Integer[] l = {41,671,9,5,3,7,0,12,2000,34,56,45,21};
//System.out.println(Arrays.asList(l));
QCTest.seq2(l,0,l.length-1);
System.out.println(Arrays.asList(l));
}
//快速排序
public static List<Integer> seq1(List<Integer> l){
Integer i = l.get(0);
List<Integer> l1 = new ArrayList<>();
List<Integer> l2 = new ArrayList<>();
l.subList(1, l.size()).forEach(ll -> {
if (ll < i) { //取出比他小的
l1.add(ll);
} else { //取出比他大的
l2.add(ll);
}
});
List<Integer> result = new ArrayList<>();
if(!CollectionUtils.isEmpty(l1)){
result.addAll(seq1(l1));
}
result.add(i);
if(!CollectionUtils.isEmpty(l2)){
result.addAll(seq1(l2));
}
return result;
}
//此方法比方法1节省空间。每次调用不需要重新分配二个队列
public static void seq2(Integer[] l, int low, int high) {
if(low > high){
return;
}
int first = l[low],temp;
int i = low ;
int j = high;
while (j > i) {
while (l[j] >= first && j > i) {
j--;
}
while (l[i] <= first && j > i) {
i++;
}
//System.out.println(j+"--"+i);
if (j > i) {
temp = l[j];
l[j] = l[i];
l[i] = temp;
}
//System.out.println(Arrays.asList(l));
}
l[low] = l[i];
l[i] = first;
seq2(l, low, i-1);
seq2(l, j+1, high);
}
//方法3
public static void sort(List<Integer> l){
if(l.size() < 2){
return;
}
int mid = l.get(0);
int fangXiang = 0; //0 表向左,1表向右
int left =0 ,wright = l.size()-1;
int currentIndex = 0;
while (left < wright){
if(fangXiang == 0){
if(l.get(wright) < mid){
int tmep = l.get(wright);
l.set(wright, mid);
l.set(left, tmep);
fangXiang = 1;
currentIndex = wright;
}else {
wright--;
}
}
if(fangXiang == 1){
if(l.get(left) > mid){
int tmep = l.get(left);
l.set(left, mid);
l.set(wright, tmep);
fangXiang = 0;
currentIndex = left;
}else {
left++;
}
}
}
sort(l.subList(0, currentIndex));
sort(l.subList(currentIndex+1, l.size() ));
}
}
方法2比方法1节省空间,每次调用不需要重新分配二个队列,效率更高。