ฉันได้ดูวิธีการนับการแลกเปลี่ยนและการเปรียบเทียบสำหรับการเรียงลำดับแบบฟองและแก้ไขโปรแกรมการเรียงลำดับแบบเชคเกอร์เป็นดังนี้:
public void shakerSort(int a[]) // http://www.geeksforgeeks.org/cocktail-sort/
{
boolean swapped = true;
comparisons = 0;
swaps = 0;
int start = 0;
int end = a.length;
while (swapped==true)
{
swapped = false;
for (int i = start; i < end-1; ++i)
{
comparisons++; //count comparisons
if (a[i] > a[i + 1])
{
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
swapped = true;
swaps++; //count swaps
}
}
if (swapped==false)
{
break;
}
swapped = false;
end = end-1;
for (int i = end-1; i >=start; i--)
{
comparisons++; //count comparisons
if (a[i] > a[i+1])
{
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
swapped = true;
swaps++; //count swaps
}
}
start = start+1;
}
}
อย่างไรก็ตาม สำหรับอาร์เรย์ 100 องค์ประกอบซึ่งจำนวนการเปรียบเทียบควรเป็น 4950 เสมอ ( n(n-1)/2 ) มันจะให้ค่าที่เปลี่ยนแปลงทุกครั้งที่ฉันรันโปรแกรม และค่านี้จะน้อยกว่า 4950 เสมอ .
เหตุใดจึงทำเช่นนี้ และฉันจะแก้ไขได้อย่างไร
(หมายเหตุ: อาร์เรย์จะถูกสุ่มทุกครั้งที่รันโปรแกรม)
นอกจากนี้การนับค่าสวอปยังโอเคหรือไม่?
while(swap)
ตอนนี้ มันจะต้องเป็นสาเหตุของการเปลี่ยนแปลงในการนับ คิดว่าถ้าไม่มีตัวแปรที่ถูกสลับและswap
ของคุณไม่เปลี่ยนเป็นtrue
ดังนั้นมันจึงเป็นfalse
ในกรณีนี้โปรแกรมจะไม่วนซ้ำ นั่นเป็นเหตุผลเดียวที่ทำให้นับต่างกัน ฉันไม่แน่ใจเกี่ยวกับตรรกะการเรียงลำดับ แต่วงนั้นกำลังทำการเปลี่ยนแปลงทั้งหมดอย่างแน่นอน - person Jay Joshi   schedule 03.12.2017swap
ก็สมบูรณ์แบบเช่นกัน! - person Jay Joshi   schedule 03.12.2017