快速排序思想:设数组为(1 0 4 6 0 7 9 3 4)其中最后一个4为划分值
1.如果当前数(index)<划分值,小于区下一个数和当前数交换,小于区向右扩一个位置,index向后下一个数;
2.如果当前数(index)=划分值,index++;
3.如果当前数(index)>划分值,当前数和大于区的前一个数交换,大于区向左扩一个位置,index不动;
小结:平均时间复杂度O(nlogn);最好情况O(nlogn);最坏情况O(n^2);空间复杂度O(logn);占用内存,不占用额外内存;稳定性:不稳定
//随机快排入口
public static void quick_normal(int[] arra){
if(arra.length==0||null==arra)
return;
quick_sort(arra,0,arra.length-1);
}
public static void quick_sort(int[] arra,int left,int right) {
if(left<right){
swap(arra,left+(int)(Math.random()*(right-left+1)),right); //随机选一个数,与最后一个数交换,作为数组的划分值
int[] p = partition(arra,left,right);
quick_sort(arra,left,p[0]-1);
quick_sort(arra,p[1]+1,right);
}
}
public static int[] partition(int[] arra, int left, int right) {
int less = left - 1;
int more = right;
while (left < more) {
if (arra[right] < arra[left]) {
swap(arra, ++less, left++);
} else if (arra[right] < arra[left]) {
swap(arra, --more, left);
} else {
left++;
}
}
swap(arra, more, right);
return new int[]{less + 1, right};
}
public static void swap(int[] arra, int i, int j) {
arra[i] = arra[i] ^ arra[j];
arra[j] = arra[i] ^ arra[j];
arra[i] = arra[i] ^ arra[j];
}
//测试用例
public static void main(String[] args) {
int[] arra = {5, 7, 9, 3, 2, 6, 4, 1, 0, 8};
quick_normal(arra);
}