第九届蓝桥杯省赛--快速排序

版权声明:本文为博主原创文章,未经博主允许不得转载。

一、问题描述

  以下代码可以从数组a[]中找出第k小的元素。它使用了类似快速排序中的分治算法,期望时间复杂度是O(N)的。请仔细阅读分析源码,填写划线部分缺失的内容。

 1 import java.util.Random;
 2 public class Main{
 3     public static int quickSelect(int a[], int l, int r, int k) {
 4         Random rand = new Random();
 5         int p = rand.nextInt(r - l + 1) + l;
 6         int x = a[p];
 7         int tmp = a[p]; a[p] = a[r]; a[r] = tmp;
 8         int i = l, j = r;
 9         while(i < j) {
10                     while(i < j && a[i] < x) i++;
11                     if(i < j) {
12                             a[j] = a[i];
13                             j--;
14                     }
15                     while(i < j && a[j] > x) j--;
16                     if(i < j) {
17                             a[i] = a[j];
18                             i++;
19                     }
20             }
21             a[i] = x;
22             p = i;
23             if(i - l + 1 == k) return a[i];
24             if(i - l + 1 < k) return quickSelect( _________________________________ ); //填空
25             else return quickSelect(a, l, i - 1, k);    
26     }
27     public static void main(String args[]) {
28         int [] a = {1, 4, 2, 8, 5, 7};
29         System.out.println(quickSelect(a, 0, 5, 4));
30     }
31 }

  注意:只提交划线部分缺少的代码,不要抄写任何已经存在的代码或符号。

二、题目类型:代码填空、快排

三、知识点补缺补漏

  因为此题涉及快速排序算法,所以决定先介绍它。如果不懂快速排序的思想,做这道题会很吃力的。

  以下介绍摘自百度百科:

  快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
  一趟快速排序的算法是:
    1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
    2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
    3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]的值赋给A[i];
    4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]的值赋给A[j];
    5)重复第3、4步,直到i=j;

  代码如下:

 1 import java.util.Arrays;
 2 
 3 public class QuickSort {
 4 
 5     public static void main(String[] args) {
 6         // TODO Auto-generated method stub
 7         int[] arr = new int[] {3,4,6,7,2,7,2,8,0} ;
 8         quickSort(arr, 0, arr.length -1) ;
 9         System.out.println(Arrays.toString(arr)); 
10     }
11 
12     public static void quickSort(int[] arr, int start, int end) {
13         if(start<end) { //递归结束条件
14             //把数组中的第0个数字作为标准数
15             int stard = arr[start] ;
16             //记录需要排序的下标
17             int low = start ;
18             int high = end ;
19             //循环找比标准数大的数和比标准数少的数
20             while(low < high) {
21                 //右边的数字比标准数大
22                 while(low<high && stard<=arr[high]) {
23                     high-- ;
24                 }
25                 //使用右边的数字替换左边的数
26                 arr[low] = arr[high] ;
27                 //如果左边的数字比标准数小
28                 while(low<high && stard >= arr[low]) {
29                     low++ ;
30                 } 
31                 arr[high] = arr[low] ;    
32             }
33             //把标准数赋给下标重合所在位置的元素
34             arr[low] = stard ;
35             //处理所有小的数字
36             quickSort(arr,start,low) ;
37             //处理所有大的数字
38             quickSort(arr,low+1,end) ;
39         }
40     }   
41 }

四、解题思路及答案

1             if(i - l + 1 == k) return a[i];
2             if(i - l + 1 < k) return quickSelect( _________________________________ ); //填空
3             else return quickSelect(a, l, i - 1, k);

  以上代码的意思是,如果标准数 key 的下标减去 l 再加上1会等于 k(第k小的元素,从1开始计数),那么标准数就是第k小元素;否则,如果小于k,那么第k小的元素会在比标准数大的且还未处理的元素中,那么这次所传入的k就会等于 k-(i-l+1);如果大于k,那么那么第k小的元素会在比标准数小且还未处理的元素中,k还是k 。

 答案:a,i+1,r,k-(i-l+1)

 

转载于:https://www.cnblogs.com/crush-u-1214/p/10484328.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值