快速排序是对冒泡排序的一种改进,它是通过一趟排序把数组分成比关键字大的和小的两部分,然后再分别对这两部分再进行这种操作,一直到只有一个关键字不能再分为止。其平均时间复杂度是O(NLOGN),但最坏情况也有O(N*N),所以不太稳定。
public class QuickSort {
public static int[] quickSort(int[] A, int n) {
quick(A, 0, n - 1);
return A;
}
private static int[] quick(int[] A, int low, int high) {
// TODO Auto-generated method stub
if (low < high) {//长度大于一
int mid = sort(A, low, high);//将数组分为大小两部分
quick(A, low, mid-1);//对低子表进行递归排序
quick(A, mid + 1, high);//对高子表进行递归排序
}
return A;
}
private static int sort(int[] A, int low, int high) {
// TODO Auto-generated method stub
int key = A[low];
int i = low;
int j = high;
if(low<high){
while(i<j){
//比key小的移到低端
while(i<j&&A[j]>=key){
j--;
}if(i<j){
A[i]=A[j];
}
//比key大的移动到右端
while(i<j&&A[i]<=key){
i++;
}if(i<j){
A[j]=A[i];
}
}
A[i]=key;//这种移动会导致中间数移动到前面或者后面但是这个位置的数还是原来的值,此时它应该变成我们的关键字的值
}
return i;
}
}