Apakah ada fungsi perpustakaan yang tersedia di perpustakaan standar C untuk melakukan penyortiran?
Apakah ada fungsi perpustakaan yang tersedia di perpustakaan standar C untuk melakukan penyortiran?
Jawaban:
qsort()
adalah fungsi yang Anda cari. Anda menyebutnya dengan penunjuk ke larik data Anda, jumlah elemen dalam larik itu, ukuran setiap elemen, dan fungsi perbandingan.
Itu melakukan keajaibannya dan array Anda diurutkan di tempat. Contohnya sebagai berikut:
#include <stdio.h>
#include <stdlib.h>
int comp (const void * elem1, const void * elem2)
{
int f = *((int*)elem1);
int s = *((int*)elem2);
if (f > s) return 1;
if (f < s) return -1;
return 0;
}
int main(int argc, char* argv[])
{
int x[] = {4,5,2,3,1,0,9,8,6,7};
qsort (x, sizeof(x)/sizeof(*x), sizeof(*x), comp);
for (int i = 0 ; i < 10 ; i++)
printf ("%d ", x[i]);
return 0;
}
return (f > s) - (f < s);
qsort
Fungsi" Poin 4 "Jika dua elemen dibandingkan sebagai sama, urutannya dalam larik terurut yang dihasilkan tidak ditentukan."
Pustaka standar C / C ++ <stdlib.h>
berisi qsort
fungsi.
Ini bukan implementasi pengurutan cepat terbaik di dunia tetapi cukup cepat dan SANGAT MUDAH digunakan ... sintaks formal qsort adalah:
qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);
Satu-satunya hal yang perlu Anda terapkan adalah bandingkan_fungsi, yang menggunakan dua argumen berjenis "const void", yang dapat ditransmisikan ke struktur data yang sesuai, lalu mengembalikan salah satu dari tiga nilai berikut:
1. Membandingkan daftar bilangan bulat :
hanya melemparkan a dan b untuk bilangan bulat jika x < y
, x-y
negatif, x == y
, x-y = 0
, x > y
, x-y
positif
x-y
adalah cara pintas untuk melakukannya :) mundur *x - *y
untuk *y - *x
untuk menyortir dalam mengurangi / urutan terbalik
int compare_function(const void *a,const void *b) {
int *x = (int *) a;
int *y = (int *) b;
return *x - *y;
}
2. Membandingkan daftar string :
Untuk membandingkan string, Anda membutuhkan strcmp
fungsi di dalam <string.h>
lib.
strcmp
akan secara default mengembalikan -ve, 0, ve dengan tepat ... untuk mengurutkan dalam urutan terbalik, cukup balikkan tanda yang dikembalikan oleh strcmp
#include <string.h>
int compare_function(const void *a,const void *b) {
return (strcmp((char *)a,(char *)b));
}
3. Membandingkan angka floating point :
int compare_function(const void *a,const void *b) {
double *x = (double *) a;
double *y = (double *) b;
// return *x - *y; // this is WRONG...
if (*x < *y) return -1;
else if (*x > *y) return 1; return 0;
}
4. Membandingkan catatan berdasarkan kunci :
Terkadang Anda perlu mengurutkan barang yang lebih kompleks, seperti catatan. Berikut adalah cara termudah untuk melakukannya menggunakan qsort
library.
typedef struct {
int key;
double value;
} the_record;
int compare_function(const void *a,const void *b) {
the_record *x = (the_record *) a;
the_record *y = (the_record *) b;
return x->key - y->key;
}
int
, nilai yang diteruskan ke pembanding keduanya int *
disamarkan sebagai void *
. char *
Oleh karena itu, saat menyortir array , nilai yang diteruskan ke pembanding keduanya char **
disamarkan sebagaivoid *
. Oleh karena itu, kode yang benar harus: int compare_function(const void *a,const void *b) { return (strcmp(*(char **)a, *(char **)b)); }
.
if (x > y) return +1; else if (x < y) return -1; else return 0;
, atau jika Anda menginginkan ekspresi sederhana, maka return (x > y) - (x < y);
. Ini selalu mengevaluasi dua perbandingan pada tingkat C, tetapi pengoptimal mungkin dapat menghindarinya. Pengurangan tidak bekerja pada nilai yang tidak bertanda tangan. Versi pertama berfungsi dengan baik ketika Anda berurusan dengan serangkaian perbandingan - membandingkan 2 anggota integer struktur terlebih dahulu, dan jika mereka sama, lalu dua ganda, lalu dua string, dll. Ada lebih dari satu cara untuk melakukannya, di C serta Perl.
Yang pasti: qsort()
adalah implementasi dari semacam (tidak harus quicksort seperti namanya).
Coba man 3 qsort atau baca di http://linux.die.net/man/3/qsort
qsort
tidak harus diimplementasikan menggunakan Quicksort.
Meskipun tidak persis di perpustakaan standar, https://github.com/swenson/sort hanya memiliki dua file header yang dapat Anda sertakan untuk mendapatkan akses ke berbagai perutean penyortiran yang sangat cepat, seperti:
#define SORT_NAME int64 #define SORT_TYPE int64_t #define SORT_CMP ( x , y ) (( x ) - ( y )) #include "sort.h" / * Sekarang Anda memiliki akses ke int64_quick_sort, int64_tim_sort, dll., misalnya, * / int64_quick_sort ( arr , 128 ); / * Asumsikan Anda memiliki beberapa int * arr atau int arr [128]; * /
Ini harus setidaknya dua kali lebih cepat dari perpustakaan standar qsort
, karena tidak menggunakan penunjuk fungsi, dan memiliki banyak opsi algoritma pengurutan lainnya untuk dipilih.
Ada di C89, jadi pada dasarnya harus bekerja di setiap kompiler C.
coba qsort
di stdlib.h.
Gunakan qsort()
dalam <stdlib.h>
.
@paxdiablo qsort()
Fungsi tersebut sesuai dengan ISO / IEC 9899: 1990 (`` ISO C90 '').
Ada beberapa fungsi penyortiran C yang tersedia di stdlib.h
. Anda dapat melakukannya man 3 qsort
di mesin unix untuk mendapatkan daftar mereka tetapi itu termasuk: