蓝桥杯试题 快速排序 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);
    }

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快速排序QuickSort)是一种高效的排序算法,它基于分治策略。该算法首先选择一个元素作为基准值(pivot),然后将待排序组按照基准值分成两个子组,一边是所有小于基准值的元素,另一边是所有大于等于基准值的元素。然后对两个子组分别递归地进行快速排序,最后将两个子组合并起来即可得到完整的有序组。 以下是使用C++实现快速排序的代码: ```cpp void quickSort(vector<int>& nums, int left, int right) { if (left >= right) return; // 递归终止条件 int pivot = nums[left]; // 选择第一个元素作为基准值 int i = left, j = right; while (i < j) { // 一趟快速排序 while (i < j && nums[j] >= pivot) j--; // 从右往左找到第一个小于基准值的元素 if (i < j) nums[i++] = nums[j]; // 将该元素放入左半部分 while (i < j && nums[i] < pivot) i++; // 从左往右找到第一个大于等于基准值的元素 if (i < j) nums[j--] = nums[i]; // 将该元素放入右半部分 } nums[i] = pivot; // 将基准值放入合适的位置 quickSort(nums, left, i - 1); // 递归地对左半部分进行快速排序 quickSort(nums, i + 1, right); // 递归地对右半部分进行快速排序 } ``` 其中,`nums`表示待排序组,`left`和`right`表示当前子组的左右边界(初始时应为0和`nums.size()-1`)。我们首先选择第一个元素作为基准值,然后使用双指针i和j在组中进行一趟快速排序,将小于基准值的元素放入左半部分,将大于等于基准值的元素放入右半部分。最后将基准值放入合适的位置,并递归地对左右两个子组进行快速排序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值