zoukankan      html  css  js  c++  java
  • sort和qsort排序

    qsort(数组名,数组长度,数组中每个元素大小,compare); compare函数的写法决定了排序是升序还是降序。需要#include<stdlib.h>
    例如:
    int compare(const void*a,const void*b){return *(int*)a-*(int*)b;}
    示例:qsort(a,10,sizeof(int),compare) //假设已定义了整型数组a[10]
    升序排序的写法,如果是:return *(*int)b-*(int*)a 就是降序,不论是什么类型的数组,该函数的形式都是这样的
    sort(数组名,数组末地址,compare) //若不写compare则默认升序排列,需要#include<algorithm>
    例如:
    sort(a,a+10); //将数组a以升序排序,假设先前定义了a[10]并输入了数据

    一、对int类型数组排序

    int num[100];

    int cmp ( const void *a , const void *b )
    {
    return *(int *)a - *(int *)b;
    }

    qsort(num,100,sizeof(num[0]),cmp);

    二、对char类型数组排序(同int类型)

    char word[100];

    int cmp( const void *a , const void *b )
    {
    return *(char *)a - *(int *)b;
    }

    qsort(word,100,sizeof(word[0]),cmp);

    三、对double类型数组排序

    double in[100];

    int cmp( const void *a , const void *b )
    {
    return *(double *)a > *(double *)b ? 1 : -1;
    }

    qsort(in,100,sizeof(in[0]),cmp);

    四、对结构体一级排序

    struct Sample
    {
    double data;
    int other;
    }s[100]

    //按照data的值从小到大将结构体排序

    int cmp( const void *a ,const void *b)
    {
    return (*(Sample *)a).data > (*(Sample *)b).data ? 1 : -1;
    }

    qsort(s,100,sizeof(s[0]),cmp);

    五、对结构体二级排序

    struct Sample
    {
    int x;
    int y;
    }s[100];

    //按照x从小到大排序,当x相等时按照y从大到小排序

    int cmp( const void *a , const void *b )
    {
    struct Sample *c = (Sample *)a;
    struct Sample *d = (Sample *)b;
    if(c->x != d->x) return c->x - d->x;
    else return d->y - c->y;
    }

    qsort(s,100,sizeof(s[0]),cmp);

    六、对字符串进行排序

    struct Sample
    {
    int data;
    char str[100];
    }s[100];

    //按照结构体中字符串str的字典顺序排序

    int cmp ( const void *a , const void *b )
    {
    return strcmp( (*(Sample *)a)->str , (*(Sample *)b)->str );
    }

    qsort(s,100,sizeof(s[0]),cmp);

    Problem Description

    给你n个整数,请按从大到小的顺序输出其中前m大的数。
     

    Input
    每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。
     

    Output
    对每组测试数据按从大到小的顺序输出前m大的数。
     

    Sample Input
    5 3 3 -35 92 213 -644
     

    Sample Output
    213 92 3
    Hint
    Hint
    请用VC/VC++提交
     
    /* 
    *程序的版权和版本声明部分: 
    *Copyright(c)2014,烟台大学计算机学院学生 
    *All rights reserved. 
    *作者:王振 
    *完成日期:博客发表日期 
    *版本号:v1.0 
    *对任务及求解方法的描述部分: 
    *输入描述: 
    *问题描述:
    *程序输出:
    *问题分析: 
    *算法设计: 
    */  
    /////////普通方法
    #include<iostream>
    using namespace std;
    int a[1000005];
    int main()
    {
    	int b,i,n,m,s;
    	while(cin>>n>>m)
    	{
    	while(n--)
    	{
    		cin>>b;
    	b=b+500000;
    		a[b]=1;	
    	}
    	for(i=1000004,n=1;i>=0&&n<=m;i--)
    		if(a[i]==1)
    		{
    				s=i-500000;
    			if(m!=n)
    			cout<<s<<' ';
    			else 
    				cout<<s<<endl;
    			n++;
    		}
    	}
    			return 0;
    
    
    }
    ////////sort方法
    #include<iostream>
    #include<stdlib.h>
    using namespace std;
    int a[1000001];
    int compare(const void*a,const void*b)
    {return *(int *)a - *(int *)b;}  
    int main()
    {
    	int n,m,i,s;
    	while(cin>>n>>m)
    	{
    		for(i=0;i<n;i++)
    			cin>>a[i];
    		qsort(a,n,sizeof(int),compare);
    		for(i=n-1,s=1;i>=0&&s<=m;i--)
    		{
    			if(s==m)
    				cout<<a[i]<<endl;
    			else 
    				cout<<a[i]<<' ';
    			s++;
    		
    		}
    
    
    	
    	}
    	return 0;
    
    }

    /////////qsort
    #include<iostream>
    #include<stdlib.h>
    using namespace std;
    int a[1000001];
    int compare(const void*a,const void*b)
    {return *(int *)a - *(int *)b;}  
    int main()
    {
    	int n,m,i;
    	while(cin>>n>>m)
    	{
    	
    		for(i=0;i<n;i++)
    			cin>>a[i];
    		qsort(a,n,sizeof(int),compare);
    		int flag=0;
    		for(i=n-1;i>=n-m;i--)  
            {  
                if(!flag)  
                {  
                    printf("%d",a[i]);  
                    flag=1;  
                }  
                else  
                    printf(" %d",a[i]);  
            }  
            printf("
    ");  
    
    			
    		
    		
    
    
    	
    	}
    	return 0;
    
    }

    ///////以上均超时,用c语言输入输出可以
    #include <iostream>  
    #include <cstdio>   
    #include <algorithm>   
    using namespace std;  
      
    bool cmp(int x,int y)  
    {  
        return x>y;  
    }  
      
    int a[1000000];  
      
    int main()  
    {  
        int n,k,i;  
        while(~scanf("%d%d",&n,&k))  
        {  
            for( i = 0;i<n;i++)  
            scanf("%d",&a[i]);  
            sort(a,a+n,cmp);  
            printf("%d",a[0]);  
            for(i = 1;i<k;i++)  
            printf(" %d",a[i]);  
            printf("
    ");  
        }  
      
        return 0;  
    }  
    

    前途是光明的,道路是曲折的。。。。。。。。。。。。。。
  • 相关阅读:
    c/c++ const
    Lucene2.9.1使用小结(同样适用于Lucene 3.0 )
    java 对properties 文件的写操作
    oracle 建表序列插入值
    jxl 读取2003 excel 示例
    HttpClient 的使用
    小故事
    iText 导出word 经典实现
    使用dom4j 解析xml
    lucene 在项目中的使用
  • 原文地址:https://www.cnblogs.com/oversea201405/p/3767025.html
Copyright © 2011-2022 走看看