蓝桥杯试题 ------快速排序
问题描述
用递归来实现快速排序(quick sort)算法。快速排序算法的基本思路是:假设要对一个数组a进行排序,且a[0] = x。首先对数组中的元素进行调整,使x放在正确的位置上。同时,所有比x小的数都位于它的左边,所有比x大的数都位于它的右边。然后对于左、右两段区域,递归地调用快速排序算法来进行排序。
输入格式:输入只有一行,包括若干个整数(不超过10个),以0结尾。
输出格式:输出只有一行,即排序以后的结果(不包括末尾的0)。
输入输出样例
样例输入
5 2 6 1 7 3 4 0
样例输出
1 2 3 4 5 6 7
分析
这个题实际上就是一个简单的快速排序,只是输入末尾加了0这个限制条件。分析限制条件,可以得出用一个简单的判断就可以截出0之前的输入数字,再调用快排算法即可。
下面介绍一下快速排序算法:
快速排序的思想是在一列数组中选出一个基准值,然后将小于这个基准的数放在数组的左边,将大于这个基准的数放在数组的右边。因为快速排序是通过交换位置进行分组,所以会使得相同值的相对位置顺序发生改变,所以是不稳定排序算法。在完成第一轮交换之后,可以理解成将小于和大于基准值的两组数再次进行选出基准值,进行交换等这一系列操作,即进行迭代,最后得到的数组便是一个有序数组。快速排序算法以及解释会在下面的sort()方法中的注释中展示。
import java.util.Scanner;
public class QuickSortTest {
public static void main(String[] args) {
int i,j = 0;
int n;
int[] array = new int[10];
Scanner scanner = new Scanner(System.in);
for ( i= 0; i < 10; i++){
n = scanner.nextInt();
array[i] = n;
if (n == 0){
j = i - 1;
break;
}
}
sort(array,0,j);
for ( i = 0; i < array.length; i++) {
if (array[i] == 0)
break;
System.out.print(array[i]+" ");
}
}
private static void sort(int[] array, int left,int right){
int i,j,temp;//i和j用于数组左右两边的定位
int standard;
if (left > right)
return;
i = left;
j = right;
standard = array[left];//选取基准值
//用一个二重循环实现每一轮的一次次交换过程
while (i < j){
//因为基准值是取最左边的元素,所以要从右边先开始,使得最后j指向的值应该小于等于基准值
while(array[j] >= standard && i < j){
j--;
}
while (array[i] <= standard && i <j){
i++;
}
if (i < j){
temp = array[i];
array[i]= array[j];
array[j] = temp;
}
}
/*一次次的交换之后,会因为 i<j这个限制条件,使得i == j,又因为先进行j的向左找小于基准值的数,
所以i和j共同指向的数应该是一个小于或者等于基准值的数,而在这个数的左边都是小于等于这个数的数,
右边都是大于等于这个数的数,因此这个数应该和基准值的位置进行调换,此后,基准值的左边全是小于
等于它的数,右边全是大于等于它的数,然后以最左边到i-1这些数为一组,最右边到i+1这些数为一组,
再次调用方法,迭代即可。
*/
array[left] = array[i];
array[i] = standard;
sort(array,left,i-1);
sort(array,i+1,right);
}
}