• 【算法学习笔记】05.qsort的初步应用


    第一个题比较小,wikioi的1076排序题,先说小题,展示一下qsort的基本用法。


    #include <stdio.h>
    #include <iostream>
    #include <stdlib.h>
    using namespace std;
    int a[100000];
    
    int cmp_int(const void* _a,const void* _b)
    {
    	int* a=(int*)_a;
    	int* b=(int*)_b;
    	return *a-*b;//从小到大是a-b 
    }
    int main() 
    {
    	int n;
    	cin>>n;
    	for(int i=0;i<n;i++)
    	{
    		cin>>a[i];		
    	} 
    	qsort(a,n,sizeof(int),cmp_int);
    	// sizeof (每个元素的类型)  
    	for(int i=0;i<n;i++)
    	{
    		cout<<a[i]<<" ";
    	} 
    }
    首先最关注的一点就是qsort的四个参数。

    1 待排序数组首地址 //直接用数组名即可
    2 数组中待排序元素数量// 比如这里的n 不要太大否则后面的参与进来会出现问题
    3 各元素的占用空间大小// sizeof函数来获得,比如int 就用 sizeof(int) 下面还会看到例子
    4 指向函数的指针,用于确定排序的顺序 //函数名就是指向函数的指针,此函数的特点是
    参数有两个都是 const void *_a,const void *_b 
    在内部要完成提供给qsort的比较方法。比如返回int 且 返回的是二者的差值,*a-*b,与参数顺序相同则是由大到小,反之亦然


    然后写个例题比较深入的利用此函数。

    字典:

    样例输入

    tarp given score refund only trap work earn course pepper part
    ******
    resco nfudre aptr sett coures lony

    样例输出

    score 
    :(
    part trap tarp 
    :(
    :(
    only 


    代码 基本没有自己的创新。


    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    
    char word[2000][10],sorted[2000][10];
    //虽然是6个字母 但是必须给7个空间 除了字母以外还需要保存其他的东西 
    
    
    int cmp_char(const void* _a,const void* _b)
    {
    	char* a=(char*)_a;
    	char* b=(char*)_b;
    	return *a-*b;
    }
    
    int cmp_string(const void* _a,const void* _b)
    {
    	char* a=(char*)_a;
    	char* b=(char*)_b;
    	return strcmp(a,b);//a b 是指针 
    } 
    
    int main()
    {
    	freopen("in13.txt","r",stdin);
    	freopen("out13.txt","w",stdout);
     	
     	int i=0;
    	for(;;)
    	{
    		
    		scanf("%s",word[i]);
    		if(word[i][0]=='*')
    			break;
    		i++;
    	}
    	//i是个数 
    	//为字典中的单词排序 
     	qsort(word,i,sizeof(word[0]),cmp_char);
     	//四个参数中最奇葩的是最后一个,,,函数名
     	for(int j=0;j<i;j++)
     	{
    		//sorted[j]=word[j]; 二级数组不是一等市民
    		strcpy(sorted[j],word[j]);//目的数组在前
    		qsort(sorted[j],strlen(sorted[j]),sizeof(char),cmp_char);		
     	}
     	
     	char tem[10];
     	while(scanf("%s",tem)==1)
     	{
    		qsort(tem,strlen(tem),sizeof(char),cmp_char);
    		int ok =0;
    		for(int k=0;k<i;k++)
    		{
    			if(cmp_string(sorted[k],tem)==0)
    			{	printf("%s ",word[k]); ok=1;}
    		}
    		if(!ok)
    			printf(":(");
    		printf("
    ");
     	} 
    }

    此解法有一个以前也用过的思维方式,就是先排序的预处理。

    因为已经对所有的word进行了sorted处理,所以导致找到重排后相同的单词直接输出即可。

    但是此重排,要求两个数组都重排 否则还要考虑下标对应的麻烦。。


    此处也可看岛qsort对字典序的处理

    需要一个函数strcmp 


    大概就是这些了,最近一直没怎么写题,接下来应该是鞋cantor数表和蛇形排布复习了,蛇形排布我还是很喜欢的,可以好好地总结一下。


  • 相关阅读:
    mysql 存储结构
    Mysql 创建表
    java 定时任务
    SpringBoot
    Spring : Spring初识(二)
    hadoop
    JAVA学习路线图
    redis缓存和cookie实现Session共享
    说说 JAVA 代理模式
    Spring 学习教程(五):快速入门
  • 原文地址:https://www.cnblogs.com/yuchenlin/p/4379269.html
Copyright © 2020-2023  润新知