Udostępnij za pośrednictwem


qsort_s

Wykonuje szybkie sortowanie.Wersja z quicksort z rozszerzeń zabezpieczeń opisane w Funkcje zabezpieczeń w CRT.

void qsort_s(
   void *base,
   size_t num,
   size_t width,
   int (__cdecl *compare )(void *, const void *, const void *),
   void * context
);

Parametry

  • base
    Początek tablicy docelowej.

  • num
    Rozmiar tablicy elementów.

  • width
    Element rozmiar w bajtach.

  • compare
    Porównanie funkcji.Pierwszy argument jest context wskaźnik.Drugi argument jest wskaźnik do key dla wyszukiwania.Trzeci argument jest wskaźnik do elementu tablicy, które ma być porównana z key.

  • context
    Wskaźnik do kontekstu, może być dowolny obiekt, który compare rutynowych musi mieć dostęp.

Uwagi

qsort_s Funkcji implementuje algorytm szybkiego sortowania, aby posortować obiekt array z num elementów, każdy z width bajtów.Argument base jest wskaźnik do podstawy tablicy, które mają być sortowane.qsort_szastępuje sortowane elementy tej tablicy.Argument compare jest wskaźnikiem do rutynowych dostarczone przez użytkownika, który porównuje dwa elementy tablicy i zwraca wartość, określając ich relacji.qsort_swywołania compare rutynowych jeden lub więcej razy podczas sortowania, przekazując wskaźniki do dwóch elementów tablicy na każde wywołanie:

compare( context, (void *) & elem1, (void *) & elem2 );

Rutynowe musi porównać elementy, a następnie powrócić jedną z następujących wartości:

Zwracanie wartości

Opis

< 0

elem1mniej niżelem2

0

elem1odpowiednikelem2

> 0

elem1większe niżelem2

Tablicy jest sortowany rosnąco, zgodnie z definicją funkcji porównania.Aby posortować obiekt array, w kolejności malejącej, należy odwrócić poczucie "większy niż" i "mniejszy niż" w funkcji porównania.

Jeśli do funkcji przekazano nieprawidłowe parametry, nieprawidłowy parametr wywoływana jest funkcja obsługi, zgodnie z opisem w Sprawdzanie poprawności parametru.Jeśli wykonanie jest dozwolone, aby kontynuować, a następnie funkcja zwraca i errno jest ustawiona na EINVAL.Aby uzyskać więcej informacji, zobacz errno, _doserrno, _sys_errlist i _sys_nerr.

Warunki błędów

klucz

Base

Porównaj

NUM

szerokość

errno

NULL

wszelkie

wszelkie

wszelkie

wszelkie

EINVAL

wszelkie

NULL

wszelkie

!= 0

wszelkie

EINVAL

wszelkie

wszelkie

wszelkie

wszelkie

< = 0

EINVAL

wszelkie

wszelkie

NULL

wszelkie

wszelkie

EINVAL

qsort_sma takie samo jak qsort , ale context parametr i zestawy errno.Przekazując context parametr, porównanie funkcji można użyć wskaźnik do obiektu dostępu do funkcji obiektu lub inne informacje, które nie jest dostępna za pośrednictwem wskaźnika elementu.Dodanie context powoduje, że parametr qsort_sbardziej bezpieczna, ponieważ context można uniknąć błędów chronometrażu wprowadzone za pomocą zmiennych statycznych do udostępnienia informacji udostępnionych compare funkcji.

Wymagania

Rozpoczęto wykonywanie procedury

Wymaganego nagłówka

qsort_s

<stdlib.h> i <search.h>

Aby uzyskać dodatkowe informacje o zgodności, zobacz Zgodność we wprowadzeniu.

Biblioteki: wszystkie wersje Funkcje biblioteki CRT.

Przykład

Poniższy przykład demonstruje, jak używać context parametr w qsort_sfunkcji.context Parametr ułatwia wykonywanie sortuje wielowątkowość.Zamiast używać zmienne statyczne, które musi być synchronizowany, aby zapewnić bezpieczeństwo wątków, przekazać innej context parametr w każdym sortowania.W tym przykładzie obiekt ustawień regionalnych jest używany jako context parametru.

// crt_qsort_s.cpp
// compile with: /EHsc /MT
#include <stdlib.h>
#include <stdio.h>
#include <search.h>
#include <process.h>
#include <locale.h>
#include <locale>
#include <windows.h>
using namespace std;

// The sort order is dependent on the code page.  Use 'chcp' at the
// command line to change the codepage.  When executing this application,
// the command prompt codepage must match the codepage used here:

#define CODEPAGE_850

#ifdef CODEPAGE_850
// Codepage 850 is the OEM codepage used by the command line,
// so \x00e1 is the German Sharp S in that codepage and \x00a4
// is the n tilde.

char *array1[] = { "wei\x00e1", "weis", "annehmen", "weizen", "Zeit",
                   "weit" };
char *array2[] = { "Espa\x00a4ol", "Espa\x00a4" "a", "espantado" };
char *array3[] = { "table", "tableux", "tablet" };

#define GERMAN_LOCALE "German_Germany.850"
#define SPANISH_LOCALE "Spanish_Spain.850"
#define ENGLISH_LOCALE "English_US.850"

#endif

#ifdef CODEPAGE_1252
   // If using codepage 1252 (ISO 8859-1, Latin-1), use \x00df
   // for the German Sharp S and \x001f for the n tilde.
char *array1[] = { "wei\x00df", "weis", "annehmen", "weizen", "Zeit",
                   "weit" };
char *array2[] = { "Espa\x00f1ol", "Espa\x00f1" "a", "espantado" };
char *array3[] = { "table", "tableux", "tablet" };

#define GERMAN_LOCALE "German_Germany.1252"
#define SPANISH_LOCALE "Spanish_Spain.1252"
#define ENGLISH_LOCALE "English_US.1252"

#endif

// The context parameter lets you create a more generic compare.
// Without this parameter, you would have stored the locale in a
// static variable, thus making sort_array vulnerable to thread
// conflicts.

int compare( void *pvlocale, const void *str1, const void *str2)
{
    char s1[256];
    char s2[256];
    strcpy_s(s1, 256, *(char**)str1);
    strcpy_s(s2, 256, *(char**)str2);
    _strlwr_s( s1, sizeof(s1) );
    _strlwr_s( s2, sizeof(s2) );

    locale& loc = *( reinterpret_cast< locale * > ( pvlocale));

    return use_facet< collate<char> >(loc).compare(s1, 
       &s1[strlen(s1)], s2, &s2[strlen(s2)]);

}

void sort_array(char *array[], int num, locale &loc)
{
    qsort_s(array, num, sizeof(char*), compare, &loc);
}

void print_array(char *a[], int c)
{
   for (int i = 0; i < c; i++)
     printf("%s ", a[i]);
   printf("\n");
       
}

void sort_german(void * Dummy)
{
   sort_array(array1, 6, locale(GERMAN_LOCALE));
}

void sort_spanish(void * Dummy)
{   
   sort_array(array2, 3, locale(SPANISH_LOCALE));     
}

void sort_english(void * Dummy)
{   
   sort_array(array3, 3, locale(ENGLISH_LOCALE));   
}

int main( )
{

   int i;
   HANDLE threads[3];
   
   printf("Unsorted input:\n");
   print_array(array1, 6);
   print_array(array2, 3);
   print_array(array3, 3);


   // Create several threads that perform sorts in different
   // languages at the same time. 

   threads[0] = reinterpret_cast<HANDLE>(
                 _beginthread( sort_german , 0, NULL));
   threads[1] = reinterpret_cast<HANDLE>(
                 _beginthread( sort_spanish, 0, NULL));
   threads[2] = reinterpret_cast<HANDLE>(
                 _beginthread( sort_english, 0, NULL));

   for (i = 0; i < 3; i++)
   {
      if (threads[i] == reinterpret_cast<HANDLE>(-1))
      {
         printf("Error creating threads.\n");
         exit(1);
      }
   }

   // Wait until all threads have terminated.
   WaitForMultipleObjects(3, threads, true, INFINITE);
  
   printf("Sorted output: \n");

   print_array(array1, 6);
   print_array(array2, 3);
   print_array(array3, 3);

  
  
}

Przykładowe dane wyjściowe

Unsorted input:
weiß weis annehmen weizen Zeit weit 
Español España espantado 
table tableux tablet 
Sorted output: 
annehmen weiß weis weit weizen Zeit 
España Español espantado 
table tablet tableux

Odpowiednik w programie .NET Framework

Sort

Zobacz też

Informacje

Wyszukiwanie i sortowanie danych

bsearch_s

_lsearch_s

quicksort