ความท้าทาย Bubble Sort ใน JavaScript — วิธีแก้ปัญหาสำหรับคำถามเตรียมสัมภาษณ์ของ freeCodeCamp

ก่อนอื่นเรามาดูกันว่าอัลกอริทึมคืออะไร

ตามข้อมูลของ "Britannica" อัลกอริธึมเป็นขั้นตอนเฉพาะสำหรับการแก้ปัญหาการคำนวณที่กำหนดไว้อย่างชัดเจน

อัลกอริธึมและโครงสร้างข้อมูลช่วยให้เราสามารถคิดและเทคนิคการแก้ปัญหาใหม่ได้ มันเหมือนกับการวิดพื้นให้สมองของเรามีส่วนร่วมและคิดในแบบที่เราสามารถแก้ปัญหาได้

อัลกอริทึมและโครงสร้างข้อมูลส่วนใหญ่เกี่ยวข้องกับการทำงานกับชุดข้อมูลที่กำหนด และทำให้มันทำบางอย่างจากอัลกอริทึมที่เรากำหนดหรือกำหนดไว้

สำหรับความท้าทายนี้ เราจะแก้ปัญหาความท้าทาย freeCodeCamp ในการเตรียมการสัมภาษณ์

ความท้าทาย

เมื่อพิจารณาถึงอาร์เรย์ของรายการที่ไม่ได้เรียงลำดับ เราต้องการให้สามารถส่งคืนอาร์เรย์ที่เรียงลำดับแล้วได้ เราจะเห็นวิธีการต่างๆ มากมายในการทำเช่นนี้ และเรียนรู้ข้อดีข้อเสียระหว่างแนวทางต่างๆ เหล่านี้ แม้ว่าภาษาสมัยใหม่ส่วนใหญ่จะมีวิธีจัดเรียงในตัวสำหรับการดำเนินการเช่นนี้ แต่ยังคงเป็นสิ่งสำคัญที่จะต้องเข้าใจแนวทางพื้นฐานทั่วไปบางส่วน และเรียนรู้วิธีนำไปปฏิบัติ

ที่นี่เราจะเห็นการเรียงลำดับแบบฟอง วิธีการจัดเรียงแบบบับเบิลเริ่มต้นที่จุดเริ่มต้นของอาร์เรย์ที่ไม่ได้เรียงลำดับ และ 'เพิ่มฟอง' ค่าที่ยังไม่ได้เรียงลำดับในตอนท้าย โดยวนซ้ำในอาร์เรย์จนกว่าจะเรียงลำดับเสร็จสมบูรณ์ ซึ่งทำได้โดยการเปรียบเทียบรายการที่อยู่ติดกันและสลับรายการเหล่านั้นหากรายการเหล่านั้นไม่อยู่ในลำดับ วิธีการนี้จะวนลูปต่อไปในอาเรย์จนกว่าจะไม่มีการสลับเกิดขึ้น ณ จุดที่อาเรย์ถูกเรียงลำดับ

วิธีการนี้จำเป็นต้องมีการวนซ้ำหลายครั้งผ่านอาเรย์ และสำหรับกรณีที่แย่ที่สุดและโดยเฉลี่ยจะมีความซับซ้อนของเวลากำลังสอง แม้จะเรียบง่าย แต่ก็มักจะทำไม่ได้ในสถานการณ์ส่วนใหญ่

คำแนะนำ

เขียนฟังก์ชัน bubbleSort ซึ่งรับอาร์เรย์ของจำนวนเต็มเป็นอินพุต และส่งกลับอาร์เรย์ของจำนวนเต็มเหล่านี้ตามลำดับการจัดเรียงจากน้อยไปหามาก
bubbleSort ควรเป็นฟังก์ชัน

  • bubbleSort ควรส่งคืนอาร์เรย์ที่เรียงลำดับแล้ว (น้อยที่สุดไปมาก)
  • bubbleSort ควรส่งคืนอาร์เรย์ที่ไม่มีการเปลี่ยนแปลงยกเว้นลำดับ
  • bubbleSort ไม่ควรใช้เมธอด .sort() ในตัว

วิธีแก้ปัญหา

function bubbleSort(array) {
// Only change code below this line
return array;
// Only change code above this line
}
bubbleSort([1, 4, 2, 8, 345, 123, 43, 32, 5643, 63, 123, 43, 2, 55, 1, 234, 92]);

เราได้รับอาร์เรย์และสิ่งที่โซลูชันต้องการคือเราจัดเรียงอาร์เรย์ที่กำหนดใหม่โดยเริ่มจากค่าที่น้อยที่สุดไปหาค่าที่ใหญ่ที่สุด

ตัวอย่างเช่น เราสามารถวนซ้ำอาร์เรย์และเปรียบเทียบตัวเลขได้หากตัวเลขที่กำหนดมากกว่า จากนั้นจะถูกป๊อปไปยังหมายเลขถัดไปและตำแหน่งของมันถูกสลับด้วยตัวเลขที่น้อยกว่า

โซลูชันที่ 1

function bubbleSort(array) {
for(let i=0;i<array.length -1 ;i++){
for(let j=0;j<array.length -1 - i; j++){
if(array[j]> array[j+1]){
const bSort=array[j];
array[j]=array[j+1];
array[j+1]=bSort;
}}}
return array;
}
console.log(bubbleSort([1, 4, 2, 8, 345, 123, 43, 32, 5643, 63, 123, 43, 2, 55, 1, 234, 92]));

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

[ 1, 1, 2, 2, 4, 8, 32, 43, 43, 55, 63, 92, 123, 123, 234, 345, 5643 ]

สิ่งที่ควรทราบ

คำตอบของเราเป็นฟังก์ชันล้วนๆ หรือไม่ ? ฟังก์ชันบริสุทธิ์ไม่ควรเปลี่ยนแปลงหรือกลายพันธุ์พารามิเตอร์ที่ให้มา

ฟังก์ชันของเราหากเราออกจากระบบพารามิเตอร์ซึ่งเป็นอาร์เรย์ เราจะพบว่าอาร์เรย์กำลังกลายพันธุ์และไม่ได้ทำให้มันทำงานเป็นฟังก์ชันบริสุทธิ์

เพื่อแก้ปัญหานี้ เราสามารถสร้างสำเนาแบบตื้นของพารามิเตอร์ซึ่งเป็นอาร์เรย์ดังที่แสดงด้านล่าง

function bubbleSort(array) {
const ShallowArray = array.slice();
for(let i=0;i<ShallowArray.length -1 ;i++){
for(let j=0;j<ShallowArray.length -1 - i; j++){
if(ShallowArray[j]> ShallowArray[j+1]){
const bSort=ShallowArray[j];
ShallowArray[j]=ShallowArray[j+1];
ShallowArray[j+1]=bSort;
}}}
return ShallowArray;
}

slice()วิธีการส่งกลับองค์ประกอบที่เลือกในอาร์เรย์เป็นวัตถุอาร์เรย์ใหม่

ตอนนี้ถ้าเรา console.log พารามิเตอร์ที่ให้มา เราจะสังเกตเห็นว่าอาร์เรย์ของเราไม่ได้กลายพันธุ์

//our sorted array
[ 1, 1, 2, 2, 4, 8, 32, 43, 43, 55, 63, 92, 123, 123, 234, 345, 5643 ]
//our parameter array
[ 1, 4, 2, 8, 345, 123, 43, 32, 5643, 63, 123, 43, 2, 55, 1, 234, 92 ]

ตอนนี้ฟังก์ชันของเรามีพฤติกรรมเหมือนฟังก์ชันล้วนๆ ผู้ที่รัก Functional Programming จะพบว่าสิ่งนี้มีประโยชน์

นี่เป็นบทความแรกของชุดอัลกอริทึมรายสัปดาห์และความท้าทายด้านโครงสร้างข้อมูล พบกับความท้าทายครั้งต่อไป

หากคุณมีวิธีแก้ปัญหาที่ดีกว่าสำหรับความท้าทายนี้ โปรดแจ้งให้เราทราบในส่วนความคิดเห็น

ขอขอบคุณที่อ่านบทความนี้จนถึงตอนนี้ หากคุณพบว่ามีประโยชน์ โปรดอย่าลังเลที่จะแบ่งปัน

อ่านเพิ่มเติม:





เนื้อหาเพิ่มเติมได้ที่ plainenglish.io