[ภาษาซี] วิธีการใช้ฟังก์ชัน Sort สำเร็จรูปในภาษาซี
posted on 03 Jul 2009 19:48 by mistertun in CProgrammingProสำหรับผู้ที่เขียนภาษาซีเป็นแล้ว (และควรจะเขียนฟังก์ชันใช้งานเองเป็น)
บทความของผมหลังจากนี้จะเริ่มเน้นไปทางบทความสำหรับผู้ที่มีพื้นฐานทางเขียนโปรแกรมแล้ว (เขียน
อธิบายง่ายกว่า แต่ถ้ามีแรงจะกลับมาเขียนให้ผู้เริ่มต้นอีกครับ) ซึ่งจะจัดอยู่ใน category ชื่่อ
CProgrammingPro (คนเขียนก็ไม่ได้ pro หรอกนะ แต่หาชื่อเท่ห์ๆอย่างอื่นไม่ได้ - -")
หลายๆคนคงเคยเขียนโปรแกรมที่ต้องมีการจัดเรียนข้อมูล(sort)ในอาเรย์ ซึ่งการเขียนฟังก์ชันsortเองก็อาจจะ
เสียเวลา ในภาษาซีเรามีฟังก์ชันสำเร็จรูปมาให้แล้วครับ(ซึ่งทำงานได้เร็วพอสมควร)
ข้ันแรก ทำการ include ไฟล์ stdlib.h ด้วย
ขั้นที่ 2 ก๊อปฟังก์ชันด้านล่างนี้ไปแปะไว้ก่อน main()
int compare(const void * a,const void * b)
{
return (*(int*)a - *(int*)b);
}
ขั้นที่ 3 เมื่อไหร่ที่ต้องการซอร์ต ให้แทรกฟังก์ชันนี้เข้าไป
qsort(ชื่ออาเรย์,จำนวนช่องที่ต้องการจัดเรียง,ขนาดของข้อมูลแต่ละตัว,compare);
ชื่ออาเรย์ก็คือชื่อของอาเรย์ที่เราต้องการจัดเรียงข้อมูล
จำนวนช่อง ก็คือ สมมติว่าเรามีอาเรย์ขนาด 10 ช่อง แต่ต้องการจัดเรียงแค่ 5 ช่อง เราก็ใส่ 5 แค่นั้น(ใส่เป็นตัว
แปรเช่น n ก็ได้)
ขนาดข้อมูล ตรงนี้ให้ใส่แบบนี้ครับ sizeof(ชนิดข้อมูล) ถ้าเป็นอาเรย์แบบ int ก็ให้ชนิดข้อมูลเป็น int ถ้าอาเรย์
double ก็ให้ชนิดข้อมูลเป็น double
ส่วน compare ไม่ต้องสนใจ ใส่ๆไป
นี่เป็นตัวอย่างการจัดเรียงแบบน้อยไปมาก ถ้าอยากได้แบบมากไปน้อย ในฟังก์ชัน compare ให้แก้เป็นแบบนี้
int compare(const void * a,const void * b)
{
return (*(int*)b - *(int*)a); // สังเกตว่า a และ b สลับที่กัน
}
ตัวอย่างโปรแกรมนะครับ
#include [ stdio.h ] // change [ , ] to < , >
#include [ stdlib.h ] // change [ , ] to < ,>
int compare (const void * a, const void * b)
{
return ( *(int*)b - *(int*)a ); // sort Max to Min
}
int main ()
{
int n,arr[50],i;
printf("How many number : ");
scanf("%d",&n);
printf("Input Number\n");
for(i=0;i
scanf("%d",&arr[i]);
qsort (arr, 6, sizeof(int), compare);
for (i=0;i
printf ("%d ",arr[n]);
scanf(" ");
return 0;
}
ผลการรัน
edit @ 5 Jul 2009 21:24:13 by Mistertun
edit @ 5 Jul 2009 21:25:54 by Mistertun
edit @ 5 Jul 2009 21:26:04 by Mistertun
edit @ 5 Jul 2009 21:40:07 by Mistertun
#1 By dukgadik (124.121.65.113) on 2009-07-03 20:41