快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样每次只能在相邻的数之间进行交换,交换的距离就大的多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)。其实快速排序是基于一种叫做“二分”的思想。
代码:
public class Hello {
static void quick_sort(int[] arr,int begin,int end){
if(begin > end){
return ;
}
int temp = arr[begin];//基准位
int i = begin;
int j = end;
while(i != j){
//先看右边,依次往左递减
while(i < j && arr[j] >= temp){
j--;
}
//再看左边,依次往右递增
while(i < j && arr[i] <= temp){
i++;
}
//如果满足条件,则交换
if(j>i){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
//最后将基准位与i的位置相交换
arr[begin] = arr[i];
arr[i] = temp;
//递归调制左边数组
quick_sort(arr,begin,i-1);
//递归调制右边数组
quick_sort(arr,i+1,end);
}
public static void main(String []args){
int[] array = {44,4,55,67,34,8,23};
System.out.println("排序之前:");
for(int num:array){
System.out.print(num + " ");
}
Hello.quick_sort(array,0,array.length-1);
System.out.println();
System.out.println("排序之后:");
for(int num:array){
System.out.print(num + " ");
}
}
}