zoukankan      html  css  js  c++  java
  • 清橙OJ 1082 查找第K小元素 -- 快速排序

    题目地址:http://oj.tsinsen.com/A1082

    问题描述
      给定一个大小为n的数组s和一个整数K,请找出数组中的第K小元素。
      这是一个补充程序的试题,你需要完成一个函数:
      int findKth(int *s, int n, int K)
      表示在s指向的数组中找到第K小的元素(如果K=1,表示找最小元素),你需要返回该元素的值。
      此题对时间的要求比较高,请注意下面的算法描述。
    算法描述
      你可以直接将s中的元素进行排序后输出第K小的元素,但使用这种方法你大概只能得到30%的分数。
      要在一个数组中查找第K小的元素,可以模仿快速排序的做法,即对于数组s[0..n-1],首先用数组中的任意一个元素(可以取第一个)将数组分为三个部分:s[0..p-1], s[p], s[p+1..n-1],其中s[0..p-1]中的值都不大于s[p],s[p+1..n-1]中的值不小于s[p]。
      此时,如果p=K-1,则s[p]是要查找的元素,返回s[p]。
      如果p>=K,则第K小的元素一定在s[0..p-1]中,可以在s[0..p-1]中查找第K小的元素。
      如果p<K-1,则第K小的元素一定在s[p+1..n-1]中,而且是s[p+1..n-1]中的第K-p-1小的元素,你可在这一段中查找第K-p-1大的元素即可。注意由于数组可以看作是静态指针,所以s[p+1..n-1]可以看作是以s+p+1指向的数组,你可以在C++中使用s+p+1来表示这个数组。


    这是一道完善程序的试题,你只需要在下面程序标注的"@你的代码"的位置补充适当的语句或语句段使程序能正确运行即可,在提交的时候,你要提交的内容只包括补充的内容,不包括其他的代码。
        int findKth(int *s, int n, int K)
        {
        @你的代码
        }
    


    算法实现:

    #include <stdio.h>
    
    int findKth (int * s, int n, int K){
    	int low = 0;
    	int high = n - 1;
    	int pivot = s[0];
    	while (low < high){
    		while (low < high && s[high] >= pivot)
    			--high;
    		s[low] = s[high];
    		while (low < high && s[low] <= pivot)
    			++low;
    		s[high] = s[low];
    	}
    	s[low] = pivot;
    	if (low == K - 1)
    		return s[low];
    	else if (low > K - 1)
    		return findKth (s, low, K);
    	else
    		return findKth (s + low + 1, n - low - 1, K - low - 1);
    }
    
    int main(void){
    	int data[10000];
    	int n;
    	int k;
    	int i;
    
    	scanf ("%d%d", &n, &k);
    	for (i=0; i<n; ++i)
    		scanf ("%d", &data[i]);
    	printf ("%d
    ", findKth (data, n, k));
    
    	return 0;
    }


  • 相关阅读:
    HDU 2104 hide handkerchief
    HDU 1062 Text Reverse 字符串反转
    HDU 1049
    HDU 1096 A+B for Input-Output Practice (VIII)
    POJ 1017
    C/C++一些难为人知的小细节
    小刘同学的第十二篇博文
    小刘同学的第十一篇博文
    小刘同学的第十篇博文
    小刘同学的第九篇日记
  • 原文地址:https://www.cnblogs.com/liushaobo/p/4373776.html
Copyright © 2011-2022 走看看