蓝桥杯试题 快速排序 QuickSort

蓝桥杯试题 ------快速排序

问题描述

  用递归来实现快速排序(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);
    }

}

猜你喜欢

转载自blog.csdn.net/TreeCode/article/details/105546651