zoukankan      html  css  js  c++  java
  • 快排模板(附求第k大的数)

    #include<cstdio>
    #define REP(i, a, b) for(int i = (a); i < (b); i++)
    using namespace std;
    
    const int MAXN = 112;
    int a[MAXN], n;
    
    void sort(int l, int r)
    {
    	if(l >= r) return;
    	int i = l, j = r, key = a[l];
    	
    	while(i < j)
    	{
    		while(i < j && a[j] >= key) j--;  //注意先从j开始, 也就是先从右边开始 
    		if(i < j) a[i] = a[j];
    		
    		while(i < j && a[i] <= key) i++;
    		if(i < j) a[j] = a[i];
    	}
    	
    	a[i] = key;
    	sort(l, i - 1); 
    	sort(i + 1, r);
    }
    
    int main()
    {
    	scanf("%d", &n);
    	REP(i, 0, n) scanf("%d", &a[i]);
    	sort(0, n - 1);   //这里是n-1, 我写的版本是左闭右闭 
    	REP(i, 0, n) printf("%d ", a[i]);
    	puts("");
    	return 0;
    }

    快排可以求第k大的数(如有些题目要求中位数), 利用左区间的个数来判断递归左区间还是右区间

    //快排求第k大的数 
    #include<cstdio>
    #define REP(i, a, b) for(int i = (a); i < (b); i++)
    #define _for(i, a, b) for(int i = (a); i <= (b); i++)
    using namespace std;
     
    const int MAXN = 112;
    int a[MAXN], n, k;
     
    void sort(int l, int r)  
    {
    	if(l >= r) return;  
    	int i = l, j = r, key = a[l];  
    	
    	while(i < j)
    	{
    		while(i < j && a[j] >= key) j--;
    		if(i < j) a[i] = a[j];
    		
    		while(i < j && a[i] <= key) i++;
    		if(i < j) a[j] = a[i];
    	}
    	
    	a[i] = key;
    	if(i < k) sort(i + 1, r);    //k - 1 为所求的位置, 画个图就知道了 
    	else if(i > k) return sort(l, i - 1); 
    	else return; //并没有整个数组排完, 找到了就结束 
    }
     
    int main()
    {
    	scanf("%d", &n);
    	_for(i, 1, n) scanf("%d", &a[i]);
    	scanf("%d", &k);
    	sort(1, n);  
    	printf("%d
    ", a[k]);
    	return 0;
    }
    
  • 相关阅读:
    iOS NSDictionary或NSArray与JSON字符串相互转换
    iOS 如何用Xib画一个Button
    iOS 你不知道的字符串用法
    IOS ScrollView pagingEnabled移动指定偏移
    TableView行缩进 自定义cell时候
    支付宝回调
    微信支付回调
    关于Bundle传递消息
    关于Handler
    ExpandableListView
  • 原文地址:https://www.cnblogs.com/sugewud/p/9819602.html
Copyright © 2011-2022 走看看