[/ C ++ sintaxis C] -qsort y especie función

Lenguajes C y C ++, uso diferente de la función de clasificación. lenguaje C función no pre-ordenar, si el lenguaje C, para llamar a la función de clasificación, lo que necesita para personalizar una función de clasificación para, o la función de uso qsort c lenguaje propio, su stdlib.h archivo de cabecera. El qsort en C ++ y el uso de cualquiera función de clasificación

función qsort

qsort archivo de cabecera <stdlib.h>, la función del lenguaje C
utilizando el método básico de ordenación rápida, el tiempo de complejidad es O (n * log n), la función qsort para encontrar la manera de utilizar el par de
prototipos de funciones: void qsort( void *base, size_t num, size_t width, int (__cdecl *compare );
prototipos función de comparación : int compare (const void *elem1, const void *elem2 ) );
Definición:

  1. La primera dirección de la matriz para ser comparado
  2. Comparación del número de elementos que se
  3. El tamaño de cada elemento a ser comparado
  4. Señalando el puntero de función de comparación (función qsort necesariamente tienen que escribir)
    Parámetros Significado función de comparación:
  5. La primera dirección de la matriz para ser comparado
  6. dirección final de la matriz a ser comparado

Ascendente matriz de tipo int

int num[105];
int cmp(const void *a, const void *b)
{
    return *(int *)a - *(int *)b;//(int *)a是将指针转为int类型,而*(int *)a是取出指针a中的值,升序排列
}
qsort(num, 100, sizeof(num[0]), cmp);

Si la función cmp devuelve un número positivo, entonces el primer parámetro en el parámetro después de la segunda función cmp devuelve un valor si es igual a 0, a, b no se mueve, si el valor de retorno es negativo, entonces el primer parámetro colocado delante del segundo parámetro
Para orden descendente, elreturn *(int *)b - *(int *)a;

Char tipo de matriz en orden ascendente de

char a[105];
int cmp(const void *a, const void *b)
{
    return *(char *a) - *(char *b);
}
qsort(a, 100, sizeof(a[0]), cmp);

Una matriz de tipo doble en orden ascendente (prestar especial atención)

double a[105];
int cmp(const void *a, const void *b)
{
    return *(double *)a > *(double *b) ? 1:-1;
}
qsort(a, 100, sizeof(a[0]), cmp);

Si *(double *)a - *(double *b)más de 0 a menos de 1 decimal, se devuelve 0, entonces la posición no se moverá

Tipo de estructura

struct node{
    int num;
    char name;
    double sum;
}a[105];

Para num orden ascendente de la primera, con el fin del nombre descendente, la disposición con el fin de suma ascendente

struct node{
    int num;
    char name;
    double sum;
}a[105];
int cmp(struct node *a, struct node *b)
{
    if(a->num != b->num) return a->num - b->num;
    else if(a->name != b->name) return b->name - a->name;
    else if(a->sum != b->sum) return a->sum > b->sum ? 1 : -1;
}
qsort(a, 100, sizeof(a[0]), cmp)

Struct operador -> representativa de la estructura de un valor variable de puntero eliminado
y el representante del operador de la estructura de una variable eliminado.

La función de clasificación y la diferencia en la función de la función cmp especie

nombre Tipo de retorno declaración
qsort (c) En t volver a - b
sort (c ++) bool volver a> b

La función de clasificación

especie como una función en C ++ para dar tipo especificar cuando se utiliza: using namespace std; A esto se añade #include <algoritmo>
función de clasificación es una versión mejorada de la función qsort, la función de clasificación puede ser posible con la función de clasificación, la función de clasificación sólo requiere 2 -3 argumento
primer argumento es la dirección del elemento de inicio del
segundo parámetro es la dirección del último elemento del
tercer parámetro a una función de comparación personalizada, si no hay un tercer parámetro, el valor predeterminado de clasificación ascendente

Ordenar de una matriz Descendente int

int a[105];
bool cmp(int a, int b)
{
    return a > b //sort中使用 > 而不是 - 
}
sort(a, a+100, cmp);

cmp devuelve un valor de 1, entonces el primer parámetro en frente del segundo parámetro
si es 0, entonces el primer parámetro en el segundo parámetro trasera no se utiliza -
el primer parámetro cuando el valor de retorno para escribir notación sencillo primero, si es después> descendente el segundo parámetro (el último número es mayor que el número delante de la misma 5> 4> 3> 2> 1), <en comparación con el número en orden ascendente (mayor que el número delante de este último con 1 <2 <3 <4 <5)

Escribir las matrices con el fin de carbón descendente

char a[105];
bool cmp(char a, char b)
{
    return a > b //sort中使用 > 而不是 - 
}
sort(a, a+100, cmp);

Orden descendiente del tipo doble

double a[105];
bool cmp(double a, double b)
{
    return a > b //sort中使用 > 而不是 - 
}
sort(a, a+100, cmp);

Con el fin de la cadena descendente

char str[105][105];
bool cmp(char a, char b)
{
    return a > b;
}
sort(str, str+100, cmp);

Ejemplos de estructura

En primer orden descendente num, en orden descendente el nombre

struct node{
    int num;
    char name;
}a[105];
bool cmp(struct node a, struct node b)
{
    if(node a.num != node b.num) return a.num > b.num;
    if(node a.name != node b.name) return a.name < b.name;
}
sort(a, a+100, cmp)

Ejemplo dos parámetros

#include <iostream>
#include <algorithm>
using namespace std;

int main(void)
{
    int a[105] = {2,4,1,23,5,76,0,43,24,65};
    for(int i = 0; i < 10; i++)
        cout<<a[i]<<endl;
    sort(a, a+10);
    for(int i = 0; i < 10; i++)
        cout<<a[i]<<endl;
    return 0;
}

La salida es:

Por ejemplo tres parámetros

Un par de ascendente, descendente orden de B, en orden descendente de c

struct node{
    int a;
    int b;
    double c;
}arr[105];
bool cmp(node x, node y)
{
     if(x.a != y.a)  return x.a < y.a;
     if(x.b != y.b)  return x.b > y.b;
     return x.c > y.c;
}
sort(arr, arr+100, cmp);

Ejemplos HDU 2037

título Descripción

"Este verano sin aire acondicionado?"
"Sí." "¿Qué
estás haciendo?"
"Sí viendo la Copa del Mundo, estúpida!"
"@ # $% ^ & *% ..."

De hecho, la Copa del Mundo llegó a un festival ventilador también estima que muchos ACMer pondrá a un lado el ordenador, hacia la televisión.
Como los fans, queremos ver la mayor parte del juego completo, por supuesto, como una nueva era de las buenas personas jóvenes, también debe mirar algunos otros programas, tales como la red de noticias (Nunca olvidar que preocupado por los asuntos nacionales), es 6 + 7, Súper niñas, y Wang Xiaoya de "diccionario feliz" y así sucesivamente, asumiendo que ya sabes como para ver el horario de emisión de todos los programas de televisión, que lo arreglaremos? (El objetivo es ver la mayor parte del programa completo)

Entrada

Los datos de entrada comprenden una pluralidad de ejemplo de prueba, la primera línea de cada caso de prueba sólo un número entero n (n <= 100), representa el número total de programas que como, entonces n filas, cada fila comprende dos datos Ti_s, Ti_e (1 <= i <= n), representan los tiempos i-ésimo de arranque de programa y final, con el fin de simplificar el problema, cada vez con un número entero positivo. n = 0 representa el extremo de entrada sin procesar.

Salida

Para cada caso de prueba, el número de salidas puede ver el programa de televisión completa, la salida de cada caso de prueba en una línea separada.

Ejemplo de entrada

12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
0

Ejemplo de salida

5

Ideas de resolución de problemas

Definir una estructura variable de, respectivamente, la definición de la hora de inicio, hora de finalización
de tiempo primer extremo en orden ascendente, si el extremo de la misma época, pulse la hora de inicio, en orden descendente.
Un ciclo de escritura, si un programa antes del final del tiempo o menos después de una hora de inicio del programa, a continuación, ver el programa o el programa siguiente.
código

#include <stdio.h>
#include <algorithm>
using namespace std;

struct node{
    int start;//开始时间
    int t;//结束时间
}a[105];
bool cmp(node a, node b)
{
    if(a.t == b.t) //结束时间相同时
        return a.start > b.start; //开始时间降序排列
    return a.t < b.t;//结束时间不同时,结束时间升序排列
}
int main(void)
{
    int n, ans, num;
    while(~scanf("%d", &n))
    {
        if(n == 0) break;
        for(int i = 0; i < n; i++)
        {
            scanf("%d%d", &a[i].start, &a[i].t);
        }
        ans = 0;//统计节目个数
        sort(a, a+n, cmp);
        num = a[0].t;
        for(int i = 1; i < n; i++)
        {
            if(a[i].start >= num)
            {
                ans++;
                num = a[i].t;
            }
        }
        printf("%d\n", ans+1);
    }
}

(Aprendizaje personal para su uso)

发布了20 篇原创文章 · 获赞 2 · 访问量 943

Supongo que te gusta

Origin blog.csdn.net/zhbbbbbb/article/details/103455817
Recomendado
Clasificación