快排:核心思想是确定每一个基准数的正确位置,然后这个基准数的左边都比它小,右边都比它大(默认升序),所以又可以分别求出基准数左边序列的一个基准数的正确位置,然后求右边的一个基数的正确位置,如此递归,实现整个序列的有序
举个例子:{8,3,7,9,5,4} 默认每个序列以第一个为基准数,temp=3,然后左边和右边有一个标识right=0和left=5;
递归第一轮找到8的位置{4,3,7,5},8,{9}
递归第二轮找4的位置{3},4,{7,5},8,{9}
递归第三轮找7的正确位置得到有序的序列{3,4,5,7,8,9}
实现代码如下:
public class QuickSort {
public static void main(String[] args) {
int[] ints = {1,2,3,2,1,9,90,-11};
sort(ints,0,ints.length-1);
System.out.println(Arrays.toString(ints));
}
//获取基数的正确位置的索引,默认基数是第一个数
public static int getIndex(int[] ints,int left,int right){
int temp = ints[left];
while (left<right){
while (left<right&&ints[right]>=temp)
right --;
ints[left] = ints[right];
while ((left<right&&ints[left]<=temp))
left++;
ints[right] = ints[left];
}
ints[left] = temp;
return left;
}
public static void sort(int[] ints,int left,int right){
if(left<right){
int index = getIndex(ints, left, right);
sort(ints,left,index-1);
sort(ints,index+1,right);
}
}
}
快排的效率会比冒泡,选择排序的高