如何使用快速排序算法对整数数组进行排序?
思路:就是手写快排。
快排原理:
是冒泡排序的升级版,过程是选定数组中第一个数,作为被比较值。该数依次取比较数组中其他值。比较顺序不太平常。首先从末尾比较,若比该数大,则继续向数组头方向比较,若比该数小,则交换两者的位置。交换位置后可以发现,被比较值的右边全都是比它大的数------
这样就达到部分目的了:用该数作为临界值,将原先数组中的所有值分为两边,左边是比它小的,右边比它大的。(相等的呢?那就看客官您的心情了。)
——当该数被交换后,将该数与数组前面的数进行比较,比它小的不管,继续向着数组末尾遍历,一旦碰到比它大的立刻交换位置,这样一来。左右两边的比该数小的数字集合逐渐增大,比该数字大的数字集合也逐渐增大。最终把所有的数比较完后,整个数组就被遍历一遍,并被该数分为两个区了。
代码实现(用递归):
public QuickSort{
//分区函数,最重要!
public static int partition(int[] arr , int from ,int to){
int key = arr[from];
while(from<to){
while(from<to&&key<arr[to]){
to--;
}
int temp =arr[to];
arr[to] = key;
arr[from] =temp;
while(from<to && arr[from]<key){
from++;
}
arr[to] = arr[from];
arr[from] =key;
}
return from;
}
//生成新的分区后,重复使用分区函数,直到不能再继续分区为止。
public static void quickSortFun(int[] arr,int low ,int high){
//先判断下是否要调用分区函数,判断依据是传进来被分区数组的范围值是否大于1
//分区数组范围是冲原先数组arr中划分出来的,其范围是[low,high],要判断该范围是否大于 //1,high-low>2,这样可以保证分区的必要性。但一般写的时候是保证high>low,就行了,相当于做了我几次无用的计算操作。
if(high>low+2){
int boundary =partition();
quickSortFun(arr,0,boundary-1);
quickSortFun(arr,boundary+1,high);
}
}
}