ถังเรียง
การจัดเรียงถังเป็นประโยชน์ส่วนใหญ่เมื่อป้อนข้อมูลมีการกระจายอย่างสม่ำเสมอในช่วง ตัวอย่างเช่นพิจารณาปัญหาต่อไปนี้.
เรียงชุดใหญ่ของตัวเลขลอยจุดซึ่งอยู่ในช่วง 0.0-1.0 และมีการกระจายอย่างสม่ำเสมอในช่วง เราไม่เรียงลำดับการแสดงตัวเลขได้อย่างมีประสิทธิภาพวิธีง่ายๆคือการใช้อัลกอริทึมการเรียงลำดับการเปรียบเทียบตาม ผูกไว้ที่ต่ำกว่าสำหรับการเปรียบเทียบขั้นตอนวิธีการเรียงลำดับตาม (ผสานเรียงกองเรียง, Quick-เรียง .. ฯลฯ ) คือ โอเมก้า (nlogn) นั่นคือพวกเขาไม่สามารถทำดีกว่า nlogn. เราสามารถจัดเรียงอาร์เรย์ในเส้นเวลา? จัดเรียงนับไม่สามารถนำมาใช้ที่นี่ในขณะที่เราใช้ปุ่มเป็นดัชนีในการนับการจัดเรียง นี่คือคีย์จะลอยหมายเลขจุด. มีแนวคิดที่จะใช้ประเภทถัง ต่อไปนี้เป็นอัลกอริทึมถัง. bucketSort (ARR [], n) 1) การสร้างถังที่ว่างเปล่า n (หรือรายการ). 2) ทำต่อไปนี้สำหรับทุกองค์ประกอบ ARR อาร์เรย์ [i]. ....... ) ใส่ ARR [i ] ลงในถัง [n อาร์เรย์ * [i]] 3) ถังแต่ละประเภทโดยใช้การจัดเรียงแทรก. 4) Concatenate ถังเรียงลำดับทั้งหมด. แผนภาพต่อไปนี้ (เอามาจากหนังสือ CLRS) แสดงให้เห็นถึงการทำงานของการจัดเรียงถัง. BucketSort เวลาซับซ้อน: ถ้าเราคิดว่าการแทรก ในถังใช้เวลา O (1) เวลาแล้วขั้นตอนที่ 1 และ 2 ของอัลกอริทึมดังกล่าวข้างต้นอย่างชัดเจนใช้เวลา O (n) เวลา (1) เป็นไปได้อย่างง่ายดายถ้าเราจะใช้รายการที่เชื่อมโยงให้เป็นตัวแทนของถัง (ในรหัสต่อไปนี้ C ++ เวกเตอร์ที่ใช้สำหรับความเรียบง่าย) ขั้นตอนที่ 4 ยังใช้เวลา O (n) เวลาที่จะมี n รายการในถังทั้งหมด. ขั้นตอนหลักในการวิเคราะห์เป็นขั้นตอนที่ 3 ขั้นตอนนี้ยังใช้เวลา O (n) เวลาโดยเฉลี่ยถ้าตัวเลขทั้งหมดจะถูกกระจาย (โปรดดูหนังสือ CLRS สำหรับรายละเอียดเพิ่มเติม) ดังต่อไปนี้คือ C ++ การดำเนินการตามขั้นตอนวิธีการดังกล่าวข้างต้น. // C ++ โปรแกรมในการจัดเรียงอาร์เรย์ใช้ถังจัดเรียง#include
#include
#include
โดยใช้มาตรฐาน namespace; // ฟังก์ชั่นในการจัดเรียง ARR [] ขนาด n ใช้ถังจัดเรียงเป็นโมฆะ bucketSort (float ARR [], int n) { // 1) การสร้าง n ถังเปล่าเวกเตอร์
ข [N]; // 2) องค์ประกอบมากมายใส่ในถังที่แตกต่างกันสำหรับ (int i = 0; ฉัน
{
int สอง = n * ARR [i]; // ดัชนีในถัง
ข [สอง] .push_back (ARR [i]);
} // 3) ถังแต่ละประเภทfor (int i = 0; ฉัน
การจัดเรียง (ข [i] .begin (ก) ข [i] .end ()); // 4) Concatenate ถังทั้งหมดเป็น ARR [] ดัชนี int = 0; for (int i = 0; i <n; i ++) สำหรับ (int J = 0; J <b [i] ขนาดประมาณ (); J ++) ARR [ดัชนี ++] b = [ผม] [เจ]; } / * โปรแกรมไดร์เวอร์ในการทดสอบข้างต้น funtion * / int main () { ลอย ARR [] = {0.897, 0.565, 0.656, 0.1234, 0.665, 0.3434}; int n = sizeof (ARR) / sizeof (ARR [0]); bucketSort (ARR, n); ศาล << "อาร์เรย์เรียงคือ n "; for (int i = 0; ฉัน
<< ศาล ARR [i] << "";
return 0;
}
Output: อาร์เรย์เรียงเป็น0.1234 0.3434 0.565 0.656 0.665 0.897 อ้างอิง: รู้เบื้องต้นเกี่ยวกับขั้นตอนวิธี 3rd Edition โดย Clifford สไตน์, โทมัสเอช Cormen, Charles E. Leiserson, โรนัลด์ L . Rivest http://en.wikipedia.org/wiki/Bucket_sort กรุณาเขียนความคิดเห็นถ้าคุณพบสิ่งที่ไม่ถูกต้องหรือคุณต้องการที่จะแบ่งปันข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อที่กล่าวข้างต้น
การแปล กรุณารอสักครู่..