快速排序(默认升序)
快速排序,是一种速度最快、效率最高的排序算法。主要是由于非常精炼和高度优化的内部循环。
时间复杂度为:O(nlogn)~O(n^2)
空间复杂度为:O(logn)~O(n)
目标:
将一个数组按照从大到小的顺序重新排列。
思路:
在需要排序的数组中选择一个基准值key(一般选择第一个元素),通过第一次循环之后,将数组分为两部分:比key大的,放在key的右边;比key小的,放在key的左边;然后左右各用递归,重复上述规则进行排序,以此类推知道排序完成。
- 定义i=0,j=arr.length-1,key=arr[i],即在第一次循环中,key值一直等于arr[0]的值;
- 从后往前找,遇到比key大的值不管,继续往前找,直到遇到比key小的值,就使该值和key值交换,并且i++;
- 从前往后找,遇到比key小的值不管,继续往后找,直到遇到比key大的值,就使该值和key值交换,并且j–;
- 第一次循环结束
- 同样的道理,按照上述规则,进行下一次循环,知道i=j了,说明key值放在了它应该在的位置,再对key值左边和右边的值进行排序;
- …
- 直到排序完成。
画图解释:
代码示例:
public class QuickSort {
public static void main(String[] args) {
int data[]=new int[] {2,3,5,6,8,9,0,1,4,7};
sort(data,0,data.length-1);
printArray(data);
}
public static void sort(int[] arr,int low,int high) {
if (low > high) {
return;
}
int i=low;
int j=high;
int key=arr[i];
while(i<j) {//一定不要忘记结束循环的条件,不然就出错误了,我在这里查错查了好久。
while(i<j&&arr[j]>key) {
j--;
}
if(i<j) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
i++;
}
while(i<j&&arr[i]<key) {
i++;
}
if(i<j) {
int te=arr[j];
arr[j]=arr[i];
arr[i]=te;
j--;
}
}
arr[i]=key;
sort(arr,low,i-1);//递归
sort(arr,i+1,high);//递归
}
public static void printArray(int[] arr) {
for(int x=0;x<arr.length;x++) {
System.out.print(arr[x]+" ");
}
}
}
运行结果:
0 1 2 3 4 5 6 7 8 9