มีฟังก์ชั่นไลบรารีใด ๆ ในไลบรารีมาตรฐาน C เพื่อทำการเรียงลำดับหรือไม่?
มีฟังก์ชั่นไลบรารีใด ๆ ในไลบรารีมาตรฐาน C เพื่อทำการเรียงลำดับหรือไม่?
คำตอบ:
qsort()
คือฟังก์ชันที่คุณกำลังมองหา คุณเรียกมันด้วยตัวชี้ไปยังอาร์เรย์ของข้อมูลจำนวนองค์ประกอบในอาร์เรย์ขนาดของแต่ละองค์ประกอบและฟังก์ชันเปรียบเทียบ
มันสร้างความมหัศจรรย์และอาร์เรย์ของคุณจะถูกจัดเรียงเข้าที่ ตัวอย่างดังต่อไปนี้:
#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
ฟังก์ชัน" จุด 4 "ถ้าสององค์ประกอบเปรียบเทียบว่าเท่ากันลำดับขององค์ประกอบในอาร์เรย์ที่เรียงลำดับผลลัพธ์จะไม่ระบุ"
ไลบรารีมาตรฐาน C / C ++ <stdlib.h>
มีqsort
ฟังก์ชัน
นี่ไม่ใช่การใช้งานการเรียงลำดับด่วนที่ดีที่สุดในโลก แต่เร็วพอและใช้งานง่ายมาก ... ไวยากรณ์ที่เป็นทางการของ qsort คือ:
qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);
สิ่งเดียวที่คุณต้องนำไปใช้คือ Compare_function ซึ่งใช้อาร์กิวเมนต์สองประเภท "const void" ซึ่งสามารถส่งไปยังโครงสร้างข้อมูลที่เหมาะสมจากนั้นส่งกลับค่าหนึ่งในสามค่านี้:
1. การเปรียบเทียบรายการของจำนวนเต็ม :
เพียงแค่โยนและ b เพื่อจำนวนเต็มถ้าx < y
, x-y
เป็นลบx == y
, x-y = 0
, x > y
, x-y
เป็นบวก
x-y
เป็นวิธีลัดที่จะทำมัน :) ย้อนกลับ*x - *y
ไป*y - *x
สำหรับการเรียงลำดับในการลด / ลำดับย้อนกลับ
int compare_function(const void *a,const void *b) {
int *x = (int *) a;
int *y = (int *) b;
return *x - *y;
}
2. การเปรียบเทียบรายการสตริง :
สำหรับการเปรียบเทียบสตริงคุณต้องมีstrcmp
ฟังก์ชันภายใน<string.h>
lib
strcmp
จะโดยค่าเริ่มต้น return -ve, 0, ve อย่างเหมาะสม ... เพื่อเรียงลำดับย้อนกลับเพียงแค่ย้อนกลับเครื่องหมายที่ส่งคืนโดย strcmp
#include <string.h>
int compare_function(const void *a,const void *b) {
return (strcmp((char *)a,(char *)b));
}
3. การเปรียบเทียบตัวเลขทศนิยม :
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. การเปรียบเทียบบันทึกตามคีย์ :
บางครั้งคุณต้องจัดเรียงเนื้อหาที่ซับซ้อนมากขึ้นเช่นบันทึก นี่คือวิธีที่ง่ายที่สุดในการใช้qsort
ไลบรารี
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
ค่าที่ส่งผ่านไปเปรียบเทียบมีทั้งปลอมตัวเป็นint *
void *
เมื่อเรียงลำดับอาร์เรย์ของchar *
ดังนั้นค่าที่ส่งผ่านไปเปรียบเทียบมีทั้งปลอมตัวเป็นchar **
ดังนั้นรหัสที่ถูกต้องจะต้องมี:void *
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;
return (x > y) - (x < y);
หรือถ้าคุณต้องการการแสดงออกง่ายแล้ว สิ่งนี้จะประเมินการเปรียบเทียบสองรายการที่ระดับ C เสมอ แต่เครื่องมือเพิ่มประสิทธิภาพอาจหลีกเลี่ยงสิ่งนั้นได้ การลบใช้ไม่ได้กับค่าที่ไม่ได้ลงชื่อ เวอร์ชันแรกใช้งานได้ดีเมื่อคุณกำลังจัดการกับชุดการเปรียบเทียบ - เปรียบเทียบสมาชิกจำนวนเต็ม 2 ตัวของโครงสร้างก่อนและถ้ามันเท่ากันสองคู่ตามด้วยสองสตริงเป็นต้นมีวิธีทำมากกว่าหนึ่งวิธี ใน C เช่นเดียวกับ Perl
แน่นอน: qsort()
เป็นการใช้งานการจัดเรียง (ไม่จำเป็นต้อง Quicksort เนื่องจากชื่ออาจแนะนำ)
ลอง man 3 qsort หรืออ่านได้ที่http://linux.die.net/man/3/qsort
qsort
ไม่จำเป็นต้องดำเนินการโดยใช้ Quicksort
แม้ว่าจะไม่ได้อยู่ในไลบรารีมาตรฐาน แต่https://github.com/swenson/sortมีไฟล์ส่วนหัวเพียงสองไฟล์ที่คุณสามารถรวมไว้เพื่อเข้าถึงเส้นทางการเรียงลำดับที่รวดเร็วอย่างไม่น่าเชื่อที่หลากหลายดังนี้:
#define SORT_NAME int64 # กำหนด SORT_TYPE int64_t # กำหนด SORT_CMP (x, y) ((x) - (y)) #include "sort.h" / * ขณะนี้คุณสามารถเข้าถึง int64_quick_sort, int64_tim_sort ฯลฯ เช่น * / int64_quick_sort (arr, 128); / * สมมติว่าคุณมี int * arr หรือ int arr [128]; * /
สิ่งนี้ควรเร็วกว่าไลบรารีมาตรฐานอย่างน้อยสองเท่าqsort
เนื่องจากไม่ได้ใช้ตัวชี้ฟังก์ชันและมีตัวเลือกอัลกอริทึมการเรียงลำดับอื่น ๆ ให้เลือกมากมาย
มันอยู่ใน C89 ดังนั้นควรทำงานในคอมไพเลอร์ C ทุกตัว
ลองqsort
ใน stdlib.h.
ใช้qsort()
ใน<stdlib.h>
.
@paxdiablo qsort()
ฟังก์ชั่นสอดคล้องกับ ISO / IEC 9899: 1990 ( `` ISO C90 '')
มีหลายฟังก์ชั่นการเรียงลำดับ C stdlib.h
ที่มีอยู่ในที่มี คุณสามารถทำman 3 qsort
บนเครื่องยูนิกซ์เพื่อรับรายชื่อ แต่รวมถึง: