สำหรับผู้ที่เขียนภาษาซีเป็นแล้ว (และควรจะเขียนฟังก์ชันใช้งานเองเป็น)

    บทความของผมหลังจากนี้จะเริ่มเน้นไปทางบทความสำหรับผู้ที่มีพื้นฐานทางเขียนโปรแกรมแล้ว (เขียน
อธิบายง่ายกว่า แต่ถ้ามีแรงจะกลับมาเขียนให้ผู้เริ่มต้นอีกครับ) ซึ่งจะจัดอยู่ใน 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

Comment



smilebig smileopen-mounthed smileconfused smilesad smileangry smiletonguequestionembarrassedsurprised smilewinkdouble winkcry

Tweet

สุโค่ยเลยจร้า big smile

#1 By dukgadik (124.121.65.113) on 2009-07-03 20:41