快速排序
快速排序是一种分治的排序算法。它将一个数组分成两个子数组,将两部分独立的进行排序。
过程主要是这样的(按我的理解):
先确定一个值,哪一个都行,然后让数组其他的数与他进行比较,比这个数大的放在右边,小的放在左边,这样就形成的两个数组,然后使用递归的方法对其两个子数组进行排序。
通过递归可以了解,就是通过一次次的快排,每一次都将数组一分为二这样来排序的,因为一分为二的过程中总是能排定一个元素,用归纳法不难证明递归能够排序:如果左数组和右数组都是有序的,那么有左数组(有序求没有任何圆度大于切分元素)、切分元素和右数组(有序求没有任何圆度小于切分元素)组成的结果数组也一定是有序的。
要完成这个实现,需要实现切分方法,代码如下:
public class Quick {
public static void main(String[] args) {
int[] numbers = {10,20,15,0,6,7,2,1,-5,55};
System.out.print("排序前:");
printArr(numbers);
quick(numbers);
System.out.print("快速排序后:");
printArr(numbers);
}
public static void printArr(int[] numbers){
for(int i = 0 ; i < numbers.length ; i ++ ){
System.out.print(numbers[i] + ",");
}
System.out.println("");
}
/**
* 查找出中轴(默认是最低位low)的在numbers数组排序后所在位置
*
* @param numbers 带查找数组
* @param low 开始位置
* @param high 结束位置
* @return 中轴所在位置
*/
public static int getMiddle(int[] numbers, int low,int high){
int temp = numbers[low]; //数组的第一个作为中轴
while(low < high){
while(low < high && numbers[high] > temp){
high--;
}
numbers[low] = numbers[high];//比中轴小的记录移到低端
while(low < high && numbers[low] < temp){
low++;
}
numbers[high] = numbers[low] ; //比中轴大的记录移到高端
}
numbers[low] = temp ; //中轴记录到尾
return low ; // 返回中轴的位置
}
/**
*
* @param numbers 带排序数组
* @param low 开始位置
* @param high 结束位置
*/
public static void quickSort(int[] numbers,int low,int high){
if(low < high){
int middle = getMiddle(numbers,low,high); //将numbers数组进行一分为二
quickSort(numbers, low, middle-1); //对低字段表进行递归排序
quickSort(numbers, middle+1, high); //对高字段表进行递归排序
}
}
/**
* 快速排序
* @param numbers 带排序数组
*/
public static void quick(int[] numbers){
if(numbers.length > 0){ //查看数组是否为空
quickSort(numbers, 0, numbers.length-1);
}
}
}