快排的原理就是设定一个基准,把比它小的数放在左边,比它大的数放在右边。完成第一次排序
这样同时也就分成了左右两个区间,再递归的对区间内的元素进行排序,这样就可以对整个数组进行排序了。
分成三部分:
quicksort
subsort
swap
quicksort
public static void quicksort(int[] data){
if(data.length != null){
subsort(data,0,data.length -1 );
}
}
subsort
public statci void subsort (int[] data, int left , int right){
if(left < right){
int base = data[left];
int i = left;
int j =right ;
while(true){
while (i<right && data[i] <= base );
while(j>left && data[j] >= base );
if (i<j)
swap(data,i,j);
else
break;
}
subsort(data,left,j-1);
subsort(data,right,i-1);
}
}
swap
public static void swap(int[] data , int i ,int j){
int tmp;
tmp = data[i];
data[i] = data[j] ;
data[j] = tmp ;
}
全部代码:
public class QuickRem {
public static void main(String[] args) {
int[] data = {9, -16, 21, 23, -30, -49, 21, 30, 30};
System.out.println (" 排序之前: \n" +
java.util.Arrays.toString (data));
quickSort (data);
System.out.println (" 排序之后: \n" +
java.util.Arrays.toString (data));
}
private static void quickSort(int[] data) {
if (data.length != 0) {
subSort (data, 0, data.length - 1);
}
}
private static void subSort(int[] data, int left/*0*/, int right/*最后一个索引*/) {
if (left < right) {
int base = data[left];
int i = left;
int j = right + 1;//+1 +1 +1
while (true) {
while (i < right && data[++i] <= base)
;
while (j > left && data[--j] >= base)
;
if (i < j)
swap (data, i, j);
else
break;
}
subSort(data,left,j);
subSort (data, left, j - 1); //左半边
subSort (data, j + 1, right); //右半边
}
}
private static void swap(int[] data, int i, int j) {
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}