จำนวนการแลกเปลี่ยนและการเปรียบเทียบใน Shaker/Cocktail sort -Java

ฉันได้ดูวิธีการนับการแลกเปลี่ยนและการเปรียบเทียบสำหรับการเรียงลำดับแบบฟองและแก้ไขโปรแกรมการเรียงลำดับแบบเชคเกอร์เป็นดังนี้:

 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 เสมอ .

เหตุใดจึงทำเช่นนี้ และฉันจะแก้ไขได้อย่างไร

(หมายเหตุ: อาร์เรย์จะถูกสุ่มทุกครั้งที่รันโปรแกรม)

นอกจากนี้การนับค่าสวอปยังโอเคหรือไม่?


person TheDeadline    schedule 03.12.2017    source แหล่งที่มา
comment
คุณให้อาร์เรย์เดียวกันกับอินพุตหรือไม่?   -  person Jay Joshi    schedule 03.12.2017
comment
มันมีขนาดเท่ากันเสมอ แต่จะมีการสุ่มที่แตกต่างกันในแต่ละครั้ง มันจะมีผลกระทบมั้ย?   -  person TheDeadline    schedule 03.12.2017
comment
ใช่ครับ อาจมีกรณี.! ดูสิ คุณวนซ้ำ while(swap) ตอนนี้ มันจะต้องเป็นสาเหตุของการเปลี่ยนแปลงในการนับ คิดว่าถ้าไม่มีตัวแปรที่ถูกสลับและ swap ของคุณไม่เปลี่ยนเป็น true ดังนั้นมันจึงเป็น false ในกรณีนี้โปรแกรมจะไม่วนซ้ำ นั่นเป็นเหตุผลเดียวที่ทำให้นับต่างกัน ฉันไม่แน่ใจเกี่ยวกับตรรกะการเรียงลำดับ แต่วงนั้นกำลังทำการเปลี่ยนแปลงทั้งหมดอย่างแน่นอน   -  person Jay Joshi    schedule 03.12.2017
comment
อืม เข้าใจแล้ว แต่ไม่รู้จะแก้ไขยังไง...   -  person TheDeadline    schedule 03.12.2017
comment
ไม่มีอะไรที่จะแก้ไข ทุกอย่างถูกต้อง ฉันตรวจสอบอัลกอริทึม และรหัสของคุณก็สมบูรณ์แบบ คุณเพียงแค่ต้องยอมรับว่าจำนวนการวนซ้ำจะแตกต่างกันสำหรับทุกอินพุต ดังนั้นการนับจึงจะแตกต่างออกไป นอกจากนี้การนับ swap ก็สมบูรณ์แบบเช่นกัน!   -  person Jay Joshi    schedule 03.12.2017
comment
โอ้ มันวิเศษมาก! ขอบคุณ!   -  person TheDeadline    schedule 03.12.2017
comment
ให้เราสนทนาต่อในการแชท   -  person Jay Joshi    schedule 03.12.2017


คำตอบ (1)


ลองใช้ตัวอย่างและทำความเข้าใจการเปลี่ยนแปลงในการนับ:

อาร์เรย์[5] = { 2 , 1 , 3 , 4 , 5 }

ควรทำซ้ำกี่ครั้ง

ขั้นแรก การเรียงลำดับเชคเกอร์จะตรวจสอบตั้งแต่เริ่มต้นและจากครั้งสุดท้ายในทุกรอบ count เป็น 0 เมื่อเริ่มต้น

 2 , 1 , 3 , 4 , 5 --> count = 1
 ^   ^
 it will swap 2 and 1
 swap count++

 1 , 2 , 3 , 4 , 5  --> count = 2
             ^   ^
 no swap

โปรแกรมจะตรวจสอบอีกครั้งเนื่องจาก swap = true

 1 , 2 , 3 , 4 , 5 --> count = 3
     ^   ^
  no swap

 1 , 2 , 3 , 4 , 5  --> count = 4
         ^   ^
 no swap

โปรแกรมจะจบแล้วเพราะตอนนี้swap = false.


ตอนนี้ลองใช้อาร์เรย์ที่แตกต่างกัน:

อาร์เรย์[5] = { 5 , 4 , 3 , 2 , 1 }

ในทำนองเดียวกัน การวนซ้ำจะมีมากกว่าการวนซ้ำ 4 ครั้ง!


ดังนั้น สำหรับอาร์เรย์ที่มีขนาดเท่ากันและค่าต่างกัน จำนวนการวนซ้ำจะแตกต่างกัน!

หมายเหตุ: จำนวนการแลกเปลี่ยนและการนับซ้ำถูกใช้อย่างสมบูรณ์แบบในโปรแกรม :)

person Jay Joshi    schedule 03.12.2017
comment
ขอบคุณมาก. สิ่งนี้ช่วยได้มาก! :DD - person TheDeadline; 04.12.2017