บอกไว้ก่อนนะครับว่านี่ไม่ใช่อัลกอริทึม Quicksort แต่ผมอยากหา "จำนวนลำดับที่ k ที่น้อยที่สุด" ใน unsorted int array โดยไม่ต้อง Sort
น่ะครับ อาจารย์เขาบอกให้ implement โดยใช้ Quicksort (ซึ่งผมเขียนไปแล้ว) แต่พอมาทำอันนี้ output มันไม่ถูก เลยอยากให้ช่วย
ดูโค้ดให้หน่อยครับ ตามนี้ครับ
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้#include <stdio.h>
int findkth(int a[],int l,int r,int k)
{
if(l<r){
int s = partition(a,l,r);
if(s>k)
{
findkth(a,l,s-1,k);
}
else if(s<k)
{
findkth(a,s+1,r,k);
}
else if(s==k)
{
return s;
}
}
}
int partition(int a[],int l,int r)
{
int p = a[l];
int i = 0,j = r+1;
do{
do{i++;}while(a<p);
do{j--;}while(a[j]>p);
swap(&a,&a[j]);
}while(i<j);
{
swap(&a,&a[j]);
swap(&a[l],&a[j]);
}
return j;
}
void swap(int* a,int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
main()
{
int a[100];
int i=0,j=0,kth,n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a);
}
for(i=0;i<n;i++)
{
kth = findkth(a,0,n-1,i);
printf("\nK(%d) number = %d\n",i+1,a[kth]);
}
}
โค้ดนี้ดูจะไม่มีปัญหาเวลารันกับ Input ที่ n น้อยๆครับ แต่ถ้าเกิน 8 ขึ้นไปมั้งมันจะเริ่มมั่วๆแล้วครับ อย่างของผม Input เป็น
10
1 7 13 5 4 9 10 6 2 8
ได้ Output เป็น
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้K(1) number = 1
K(2) number = 4
K(3) number = 5
K(4) number = 5
K(5) number = 6
K(6) number = 7
K(7) number = 8
K(8) number = 10
K(9) number = 10
K(10) number = 13
ซึ่ง 2 หายไปไหนก็ไม่รู้ครับ = =" แล้วก็มีบางตัวซ้ำกัน น่าแปลกที่ตัวเลขมันค่อนข้างจะเรียงกัน แต่ทำไมไม่ถูกนะ
รบกวนช่วยหา bug ให้หน่อยครับ หาไม่เจอจริงๆ
ป.ล. ถ้าก๊อบโค้ดข้างบนไปใส่ codeblock จะรันผ่านแน่ๆครับ แต่Dev-C ผมไม่ได้ลองนะ
Edit : แย่แหะ มันพิมพ์ [ i ] ไม่ได้ถ้า i ติดอยู่กับวงเล็บ รบกวนเติมด้วยนะครับ
ตรง do{i++;}while(a
<p); กับ scanf("%d",&a); กับ swap(&a,&a[j]); เป็น a[ i ] นะไม่ใช่ a เฉยๆ
ป.ล.2 ใครรู้วิธี disable พวก โค้ดตัวหนา ตัวเอียง ตัวขีดเส้นใต้ อะไรงี้ ตอนโพสบ้างไหมครับ ไม่งั้นมันจะเป็นปัญหามากๆเวลาจะโพสโค้ดภาษา c
ไม่เข้าใจอัลกอริทึมนี้ครับ รบกวนช่วยที
น่ะครับ อาจารย์เขาบอกให้ implement โดยใช้ Quicksort (ซึ่งผมเขียนไปแล้ว) แต่พอมาทำอันนี้ output มันไม่ถูก เลยอยากให้ช่วย
ดูโค้ดให้หน่อยครับ ตามนี้ครับ
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
โค้ดนี้ดูจะไม่มีปัญหาเวลารันกับ Input ที่ n น้อยๆครับ แต่ถ้าเกิน 8 ขึ้นไปมั้งมันจะเริ่มมั่วๆแล้วครับ อย่างของผม Input เป็น
10
1 7 13 5 4 9 10 6 2 8
ได้ Output เป็น
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
ซึ่ง 2 หายไปไหนก็ไม่รู้ครับ = =" แล้วก็มีบางตัวซ้ำกัน น่าแปลกที่ตัวเลขมันค่อนข้างจะเรียงกัน แต่ทำไมไม่ถูกนะ
รบกวนช่วยหา bug ให้หน่อยครับ หาไม่เจอจริงๆ
ป.ล. ถ้าก๊อบโค้ดข้างบนไปใส่ codeblock จะรันผ่านแน่ๆครับ แต่Dev-C ผมไม่ได้ลองนะ
Edit : แย่แหะ มันพิมพ์ [ i ] ไม่ได้ถ้า i ติดอยู่กับวงเล็บ รบกวนเติมด้วยนะครับ
ตรง do{i++;}while(a<p); กับ scanf("%d",&a); กับ swap(&a,&a[j]); เป็น a[ i ] นะไม่ใช่ a เฉยๆ
ป.ล.2 ใครรู้วิธี disable พวก โค้ดตัวหนา ตัวเอียง ตัวขีดเส้นใต้ อะไรงี้ ตอนโพสบ้างไหมครับ ไม่งั้นมันจะเป็นปัญหามากๆเวลาจะโพสโค้ดภาษา c