จัดเรียงอาร์เรย์จากน้อยไปหามาก จะเรียงลำดับอาเรย์หลายมิติตามหนึ่งในฟิลด์ของอาเรย์ภายในใน PHP ได้อย่างไร? วรรณคดี วรรณคดีพื้นฐาน

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

พวกเขามีพื้นฐานมาจากอะไร?

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

ความแตกต่างในการทำงานหลัก

การเรียงลำดับสามารถทำได้โดยใช้ ฟังก์ชั่นที่แตกต่างกัน- มาดูกันว่าแตกต่างกันอย่างไร:

ฟังก์ชันบางฟังก์ชันจะจัดเรียงอาร์เรย์ตามคีย์ขององค์ประกอบ ในขณะที่ฟังก์ชันอื่นๆ จัดเรียงตามค่า

มีการเรียงลำดับที่แตกต่างกัน: จากมากไปน้อย จากน้อยไปมาก เป็นธรรมชาติ ตัวเลข ตัวอักษร ผู้ใช้กำหนด หรือสุ่ม

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

แต่ละฟังก์ชันจะแก้ไขอาร์เรย์ที่ส่งผ่าน พวกเขาไม่ส่งคืนสำเนาที่เรียงลำดับ

ลำดับการจัดเรียงจะถือว่าไม่ได้กำหนดไว้เมื่อฟังก์ชันกำหนดว่าองค์ประกอบทั้งสองมีค่าเท่ากัน นี่เป็นการเรียงลำดับที่ไม่เสถียร

ฟังก์ชั่นการเรียงลำดับอาร์เรย์บางอย่างใน PHP

ฟังก์ชัน sort() และ rsort()- Sort() เรียงลำดับอาร์เรย์ตามตัวอักษร โปรดทราบ: ฟังก์ชันนี้คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ การเรียงลำดับเกิดขึ้นตามค่าโดยไม่คำนึงถึงคีย์ของบัญชี Rsort() เรียงลำดับเป็น ลำดับย้อนกลับด้วยค่าและไม่คำนึงถึงคีย์บัญชี

Asort() เป็นหนึ่งในฟังก์ชันที่รักษาความสัมพันธ์ของคีย์-ค่า ซึ่งจะมีประโยชน์สำหรับอาร์เรย์ที่เชื่อมโยงเมื่อสิ่งนี้มีความสำคัญ

ในตัวอย่าง คีย์คือชื่อของผลไม้ และค่าคือราคา การเรียงลำดับจะเกิดขึ้นโดยเรียงลำดับราคาจากน้อยไปหามาก หากคุณต้องการเรียงลำดับ คุณต้องใช้ฟังก์ชัน ksort() ซึ่งจะเรียงลำดับตามคีย์ Arsort() เรียงลำดับตามดัชนี (เชิงพรรณนา) ตามลำดับค่าจากมากไปหาน้อย Krsort() เรียงลำดับคีย์องค์ประกอบจากมากไปหาน้อย

อาร์เรย์สองมิติ

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

ในตัวอย่าง ชื่อฟังก์ชันของเราคือการเปรียบเทียบ มันมี 2 อาร์กิวเมนต์ - x, y ฟังก์ชันจะต้องยอมรับค่า 2 ค่า จากนั้นจึงกำหนดลำดับ พารามิเตอร์ x, y คือ 2 อาร์เรย์ที่อยู่ภายในอาร์เรย์หลัก y ในการเปรียบเทียบองค์ประกอบคำอธิบายจากอาร์เรย์ที่ส่งผ่านไปยังฟังก์ชัน จำเป็นต้องมีตัวแปร $x, $y บรรทัด return1 ส่งคืนค่าให้กับโค้ดที่เรียกว่าฟังก์ชัน พื้นฐานสำหรับการเรียงลำดับอาร์เรย์ของเราคือฟังก์ชัน usort() การเรียงลำดับเป็นไปตามกฎที่อธิบายโดยฟังก์ชัน comparison()

ตอนนี้การเรียงลำดับอาร์เรย์ใน PHP จะชัดเจนสำหรับคุณ

คำแนะนำ

มีหลายวิธีในการจัดเรียงอาร์เรย์ วิธีที่ง่ายที่สุดในการจัดเรียงอัลกอริธึมคือการเรียงลำดับแบบ "ฟองสบู่" แต่ก็เป็นการเรียงลำดับที่ช้าที่สุดเช่นกัน สาระสำคัญของวิธีนี้คือการดูอาร์เรย์ข้อมูลตามลำดับและเปรียบเทียบองค์ประกอบแต่ละคู่ หากองค์ประกอบด้านล่างเล็กกว่าองค์ประกอบก่อนหน้า จะมีการแลกเปลี่ยนสถานที่ จากนั้นอัลกอริทึมจะเริ่มต้นใหม่ ตัวอย่างรหัสการเรียงลำดับในภาษา C:

มวลรวม ;
int el_min=10;

สำหรับ (int i=0; ii; j--)
ถ้า (น้อยกว่า (มวล [j], มวล ))
สลับ(มวล [j], มวล);
}

หนึ่งในอัลกอริธึมที่เหมาะสมที่สุดสำหรับการเรียงลำดับอาร์เรย์จากน้อยไปหามากคือการเรียงลำดับโดยใช้วิธีการแทรก สาระสำคัญของอัลกอริทึมคือการสร้างลำดับที่กำหนดระหว่างกลุ่มองค์ประกอบ (ตามลำดับจากน้อยไปหามาก) ตัวจัดการพิเศษในลูปจะตรวจสอบอาร์เรย์เพื่อจัดลำดับ หากต้องการเรียงลำดับจากน้อยไปมาก ให้ตั้งค่า เงื่อนไขต่อไป- หากองค์ประกอบที่ตามมาน้อยกว่าองค์ประกอบก่อนหน้า องค์ประกอบนั้นจะถูกลบออกจากตำแหน่งและวางไว้บนองค์ประกอบที่สอดคล้องกับค่าของมัน โค้ดตัวอย่างสำหรับโปรแกรมเรียงลำดับจากน้อยไปหามากในภาษา C:

อินท์คอล = 40;
มวล int, k;

สำหรับ (int i = 1, j=0; i(
k = มวล [i]; // ตัวแปรเสริมสำหรับจัดเก็บองค์ประกอบอาร์เรย์
เจ = ฉัน - 1;
ในขณะที่(k(
มวล = มวล [j];
เจ--;
ถ้า (มวล j = k;
}
}

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

มวล int, bb;
int Kol = 30, นาที, pоs;

สำหรับ (int i = 0; i(
นาที = มวล [i];
ตำแหน่ง = ฉัน;
สำหรับ (int j=0; j (
ถ้า (มวล [j] (
นาที = มวล [j];
ตำแหน่ง = เจ;
}
บีบี = มวล [i];
มวล[i] = มวล;
มวล = บีบี;
}
}

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

คำแนะนำ

ใช้ฟังก์ชัน sort() หากคุณต้องการจัดเรียงข้อมูลในอาร์เรย์จากน้อยไปหามาก ตัวอย่างเช่น: $values ​​​​= array(58, 15, 2.41, 26, 30);
sort($values); จากผลการใช้งาน ตำแหน่งของข้อมูลในอาเรย์จะเปลี่ยนไป - จะเป็นดังนี้: (2.41, 15, 26, 30, 58) หากคุณเพิ่มแฟล็ก SORT_STRING ในการเรียกใช้ฟังก์ชัน ฟังก์ชันจะพิจารณาข้อมูลอาร์เรย์เป็นสตริงและจัดเรียงตาม เนื่องจากอักขระของตัวแปรสตริง “2.41” อยู่ในตัวอักษรมากกว่าอักขระตัวแรกของตัวแปรสตริง “15” หลังจากใช้ฟังก์ชัน sort($values, SORT_STRING) ตัวแปรจะถูกจัดเรียงต่างกัน: (15, 2.41, 26, 30, 58)

ใช้ฟังก์ชัน rsort() หากคุณต้องการจัดเรียงอาร์เรย์ตามค่าจากมากไปน้อย ฟังก์ชันนี้แตกต่างจากฟังก์ชันที่อธิบายไว้ในขั้นตอนแรกตามลำดับการจัดเรียงเท่านั้น

ใช้ฟังก์ชัน asort() เมื่อคุณต้องการเรียงลำดับค่าของอาร์เรย์ที่มีชื่อ (เชื่อมโยง) ตามลำดับจากน้อยไปหามาก โดยไม่ต้องเปลี่ยนการแมปดั้งเดิมระหว่างดัชนีและค่าขององค์ประกอบอาร์เรย์แต่ละรายการ ตัวอย่างเช่น: $values ​​​​= array("one" => 58, "two" => 15, "three" => 2.41, "four" => 26, "five" => 30);
asort($values); ดังนั้นลำดับขององค์ประกอบอาร์เรย์จะเป็นดังนี้: ("three" => 2.41, "two" => 15, "four" => 26, "five" => 30, "หนึ่ง" => 58 ) มิฉะนั้น การทำงานของฟังก์ชันนี้จะไม่แตกต่างจากฟังก์ชันการเรียงลำดับที่อธิบายไว้ในขั้นตอนแรก หากต้องการจัดเรียงองค์ประกอบในทำนองเดียวกันโดยเรียงลำดับจากมากไปน้อย ให้ใช้ฟังก์ชัน arsort()

ไม่ช้าก็เร็วโปรแกรมเมอร์จะต้องเรียงลำดับข้อมูลจากอาเรย์ ไม่ว่าจะเป็นการแสดงข้อมูลจากฐานข้อมูลตามลำดับตัวอักษรหรือเรียงลำดับชื่อไฟล์ตามวันที่ การเปลี่ยนแปลงครั้งล่าสุดสามารถทำได้ด้วยการติดตั้งในตัว ฟังก์ชั่น PHPเพื่อจัดเรียงข้อมูลอาร์เรย์ ในบทความนี้ ผมจะสาธิตและอธิบายพร้อมตัวอย่างว่าฟังก์ชันต่างๆ เช่น sort(), rsort() ทำงานอย่างไร

การทำงาน ; - จัดเรียงอาร์เรย์จากน้อยไปหามากและตามลำดับตัวอักษร

โครงสร้าง:

($อาร์เรย์, $ธง);

ฟังก์ชันจะเรียงลำดับอาร์เรย์ที่กำหนดให้ $Array ตามลำดับจากน้อยไปหามาก ฟังก์ชันนี้ออกแบบมาเพื่อทำงานกับรายการ รายการคืออาร์เรย์ธรรมดาซึ่งมีคีย์เริ่มต้นจากศูนย์ ฟังก์ชันนี้สามารถกำหนดอาร์กิวเมนต์ที่เป็นตัวเลือก $Flag ซึ่งจะจัดการสิ่งที่จะเกิดขึ้นอย่างแน่นอน การเรียงลำดับ- พิจารณาคำอธิบายของอาร์กิวเมนต์ $Flag:

เรียงลำดับ_ปกติ– ฟังก์ชั่นการเรียงลำดับเริ่มต้น

SORT_NUMERIC- การเรียงลำดับตัวเลขจากน้อยไปหามาก

SORT_STRING- การเรียงลำดับสตริงตามตัวอักษร

ลองพิจารณาตัวอย่าง: เรามีอาร์เรย์ที่ข้อมูลเกี่ยวกับจำนวนคู่นักเรียนในปีการศึกษาต่างๆ ถูกจัดเก็บในรูปแบบที่ไม่เป็นระเบียบ

"; ) ?> ผลลัพธ์ของสคริปต์: หลักสูตร: 1 - 72 คู่ หลักสูตร: 2 - 83 คู่ หลักสูตร: 3 - 100 คู่ หากเราไม่ได้ประยุกต์ใช้ฟังก์ชัน ผลลัพธ์ของงานจะเป็นดังนี้: หลักสูตร: 1 - 83 คู่ หลักสูตร: 2 - 100 คู่ หลักสูตร: 3 - 72 คู่

เรียงตามตัวอักษร

ด้านล่างนี้เป็นสคริปต์ที่เรียงลำดับประเทศของอาร์เรย์ตามลำดับตัวอักษร ไม่จำเป็นต้องตั้งค่าอาร์กิวเมนต์ที่สองของฟังก์ชัน ($Flag) เนื่องจาก ฟังก์ชั่นจะเข้าใจว่าต้องทำงานกับสตริง

"; ) ?> ผลงาน: อาร์เมเนีย อิตาลี รัสเซีย ญี่ปุ่น

ฟังก์ชั่น rsort() - จัดเรียงอาร์เรย์จากมากไปน้อย

ฟังก์ชันนี้ไร้เหตุผล แต่เรียงลำดับอาร์เรย์จากมากไปน้อย ลองดูที่โครงสร้างไวยากรณ์:

($อาร์เรย์, $ธง);

ตัวอย่างของฟังก์ชันนี้จะคล้ายกับตัวอย่างที่ให้ไว้ข้างต้น ยกเว้นประการหนึ่ง ข้อมูลจากอาร์เรย์จะถูกจัดเรียงจากมากไปน้อย เรากำลังสร้างรางวัลมากมายสำหรับผู้ที่คว้าอันดับที่ 1, 2 และ 3 ในการแข่งขัน

"; ) ?> ผลลัพธ์ของการใช้สคริปต์: อันดับที่ 1 - รางวัล: 2,800 รูเบิล อันดับที่ 2 - รางวัล: 1200 รูเบิล อันดับที่ 3 - รางวัล: 500 รูเบิล

โปรแกรม Sort_Obmen;

var a:อาร์เรย์ของจำนวนเต็ม;

n,i,k,x: จำนวนเต็ม;

เริ่มเขียน ("จำนวนองค์ประกอบอาร์เรย์");

สำหรับ i:=1 ถึง n อ่าน([i]);

สำหรับ k:=n-1 เหลือ 1 do (จำนวนคู่ที่จะเปรียบเทียบ)

สำหรับ i:=1 ถึง k do if a[i]>a แล้ว (สลับองค์ประกอบที่อยู่ติดกัน)

สำหรับ i:=1 ถึง n เขียน (a[i]," "); (อาร์เรย์ที่สั่ง)

นอกจากการจัดเรียงแบบบับเบิลแล้ว ยังมีวิธีการจัดเรียงอื่นๆ ที่มีประสิทธิภาพมากกว่าอีกด้วย: การเรียงลำดับอย่างรวดเร็ว วิธีเชลล์ การเรียงลำดับการแทรก...- อย่างไรก็ตาม อัลกอริธึมที่พิจารณานั้นเป็นวิธีที่ง่ายที่สุดในการนำไปใช้และมีเหตุผลมากที่สุด

อย่างไรก็ตาม เรานำเสนอขั้นตอน "การเรียงลำดับด่วน" ที่จะค้นหาที่ใหญ่ที่สุด ใหญ่เป็นอันดับสอง ฯลฯ ทีละขั้นตอน องค์ประกอบและย้ายไปยังจุดสิ้นสุดของอาร์เรย์ วงจรจะหยุดลงเมื่อสิ่งต่อไปนี้ไม่เกิดขึ้นในระหว่างการผ่านครั้งถัดไป (นั่นคือ องค์ประกอบต่างๆ ตกลงเข้าที่):

ชื่อเชือกแขวนคอ: FastSort.pas

ขั้นตอน FastSort (Var aa: Massive);

var ii,kk,nn:byte;

สำหรับ ii:=1 ถึง nn-1 ให้เริ่มต้น

ถ้า (aa>aa) จากนั้นเริ่มต้น

สลับ(aa,a);

แม้ว่าวิธีการเรียงลำดับก่อนหน้านี้จะต้องผ่าน 9 รอบสำหรับอาร์เรย์ที่มี 10 องค์ประกอบ แต่ตัวเลขนี้สามารถลดลงได้สำหรับอัลกอริทึมนี้ เช่น อาร์เรย์ของค่า (1,-3,7,-10,11,4,-6,2,5,-4) จะถูกจัดเรียงเป็น 8 รอบ และอาร์เรย์ (1,4,3 ,2,4, 5,6,7,10,11) – เพียง 1 เท่านั้น

ตามตรรกะที่คล้ายกัน ลองเรียงลำดับอาร์เรย์จากน้อยไปหามาก:

ชื่อเชือกแขวนคอ: Sort_Inc.pas

ขั้นตอน Sort_Inc(Var aa:Massive);

สำหรับ kk:=1 ถึง n-1 ให้เริ่มต้น

สำหรับ ii:=1 ถึง n-kk Do Begin

ถ้า (aa>aa) จากนั้นเริ่มต้น

สลับ(aa,a);

กำลังประมวลผลอาร์เรย์สองมิติ

หลักการพื้นฐานของการป้อนอาร์เรย์สองมิติมีหลายวิธีคล้ายกับหลักการป้อนอาร์เรย์หนึ่งมิติ เมื่ออธิบาย คุณสามารถอ้างอิงถึงจำนวนแถวของเมทริกซ์ M และ N ที่ป้อนเป็นค่าคงที่ได้ เช่น

ประเภท Matrix=อาร์เรย์ของ Real;

ตัวแปร a,b,c,d: เมทริกซ์;

e: อาร์เรย์ของไบต์;

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

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

วรรณคดี วรรณคดีพื้นฐาน

    อัคเมตอฟ เค.เอส. หลักสูตรนักสู้หนุ่ม เอ็ด ที่ 5 ม. คอมพิวเตอร์-สื่อมวลชน, 2541.

    ฟิกูร์นอฟ วี.อี. IBM PC สำหรับผู้ใช้ เอ็ด 7. M., Infra-M, 1997 และ 1999

    คู่มือการสอนด้วยตนเองของ Alexander Levin การทำงานกับคอมพิวเตอร์ ฉบับที่ 8 “คอมพิวเตอร์ทำมาจากอะไร” - Peter, 2004

    คู่มือวิธีการทางอิเล็กทรอนิกส์ MGAPI 2005

    Alekseev E.R., Chesnokova O.V., Pavlysh V.R., Slavinskaya L.F. Turbo Pascal 7.0 ฉบับที่ 2 - NT Press, M. , 2549

    โคโรตาเยฟ ดี.จี. TURBO-PASCAL ในตัวอย่างและปัญหา หนังสือเรียน MGAPI, M, 2000.

    หนังสือปัญหาการเขียนโปรแกรมในภาษาปาสคาล เรียบเรียงโดย O.F. Uskova - เซนต์ปีเตอร์สเบิร์ก, 2546

    ฟาโรนอฟ วี.วี. บทช่วยสอน เทอร์โบ- ปาสคาล- ปีเตอร์ 2550.

ทราบผลการแข่งขันยิงปืนผู้เข้าร่วม 9 คนแล้ว จัดเรียงผลลัพธ์เหล่านี้โดยเรียงลำดับคะแนนระหว่างการยิงจากน้อยไปหามาก

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

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

โปรแกรมสำหรับการนำอัลกอริธึมที่อธิบายไว้ไปใช้อาจมีรูปแบบดังต่อไปนี้:

โปรแกรม PR4;

พิมพ์ STREL=อาร์เรย์ของจำนวนเต็ม;

วาร์เรซ:strel;

ฉัน, j, s: จำนวนเต็ม;

สำหรับ i:=1 ถึง 9 ทำ

writeln('กรอกผลลัพธ์ของ ",i,"ผู้เข้าร่วมคนที่ 1");

readln(rez[i]);

สำหรับ i:=1 ถึง 8 ทำ

สำหรับ j:=i+1 ถึง 9 ทำ

ถ้า rez[i]>rez[j] แล้ว

s:=เรซ[เจ];

เรซ[j]:=เรซ[i];

เรซ[i]:=s;

writeln('เรียงลำดับผลลัพธ์จากน้อยไปหามาก:");

สำหรับ i:=1 ถึง 9 เขียน (rez[i]:5," ');

โดยที่ STREL คือประเภทของอาร์เรย์ของผลการยิงของผู้เข้าร่วม rez[i] เป็นตัวแปรที่ใช้อธิบายผลลัพธ์ของผู้เข้าร่วมคนที่ i (i แปรผันตั้งแต่ 1 ถึง 9) ตัวแปรเสริม s ถูกใช้เมื่อสลับองค์ประกอบอาร์เรย์

อัลกอริธึมการเรียงลำดับการเลือกใน Turbo Pascal
แน่นอนว่าอันดับแรกในอาร์เรย์ควรถูกยึดโดยองค์ประกอบขั้นต่ำของอาร์เรย์ ตำแหน่งที่สองคือค่าที่น้อยที่สุดของส่วนที่เหลือทั้งหมด อันดับสามโดยค่าน้อยที่สุดของส่วนที่เหลือทั้งหมด เป็นต้น
เมื่อต้องการทำเช่นนี้ คุณต้องดำเนินการตามลำดับต่อไปนี้:
1. กำหนดองค์ประกอบขั้นต่ำของอาร์เรย์
2. สลับกับองค์ประกอบแรก
3. กำหนดองค์ประกอบขั้นต่ำระหว่างองค์ประกอบที่เหลือ
4. สลับกับองค์ประกอบที่สอง ฯลฯ
ลำดับของการกระทำนี้จะต้องดำเนินการจนกว่าจะมีการกำหนดองค์ประกอบขั้นต่ำสุดท้าย
วิธีการนี้เรียกว่าการเรียงลำดับการเลือก
การดำเนินการทั้งหมดในการเรียงลำดับอาร์เรย์สามารถแบ่งออกเป็นงานที่ง่ายกว่าและเรียกว่าการเรียงลำดับการเลือก
ประการแรกคือการค้นหาองค์ประกอบขั้นต่ำ ส่วนของโปรแกรมที่นำเสนอจะเตือนคุณถึงวิธีการดำเนินการนี้

นาที:=ม.; (สมมติว่าองค์ประกอบที่ 1 มีน้อยที่สุด)
ที:=1; (และจำนวนของมัน = 1)
สำหรับ i:=1 ถึง 30 DO
ถ้า m[i]> buf:=m[t]; (ทดแทน)
ม[เสื้อ]:=ม[i];
ม[i]:=buf;
จบ;

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


41. ชุดในภาษาปาสคาล

มากมายเป็นประเภทข้อมูลที่มีโครงสร้างซึ่งเป็นชุดของออบเจ็กต์ที่เชื่อมต่อกันด้วยคุณลักษณะบางอย่างหรือกลุ่มของคุณลักษณะที่ถือได้ว่าเป็นข้อมูลทั้งหมดเดียว แต่ละวัตถุในชุดเรียกว่าองค์ประกอบของชุด

องค์ประกอบทั้งหมดของชุดจะต้องอยู่ในประเภทลำดับใดประเภทหนึ่งที่มีค่าไม่เกิน 256 ค่า ประเภทนี้เรียกว่าประเภทชุดฐาน ประเภทฐานจะถูกระบุโดยช่วงหรือการแจงนับ

ช่วงของค่าของประเภทชุดคือชุดของชุดย่อยที่เป็นไปได้ทั้งหมดซึ่งประกอบด้วยองค์ประกอบของประเภทฐาน ในนิพจน์ในภาษาปาสคาล ค่าขององค์ประกอบของชุดจะแสดงอยู่ในวงเล็บเหลี่ยม: , ["a",'b","c"], ["a".."z"]

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

ชุดสามารถรับค่าทั้งหมดของประเภทฐานได้ ประเภทฐานต้องไม่เกิน 256 ค่าที่เป็นไปได้ ดังนั้นประเภทพื้นฐานของชุดอาจเป็นไบต์ ถ่าน บูลีน และประเภทที่ได้รับจากสิ่งเหล่านั้น

ชุดในหน่วยความจำจะถูกจัดเก็บเป็นอาร์เรย์ของบิต ซึ่งแต่ละบิตจะระบุว่าองค์ประกอบนั้นเป็นของชุดที่ประกาศหรือไม่ จำนวนองค์ประกอบสูงสุดของชุดคือ 256 และข้อมูลประเภทชุดต้องมีขนาดไม่เกิน 32 ไบต์

จำนวนไบต์ที่จัดสรรสำหรับข้อมูลชุดคำนวณโดยใช้สูตร:

ByteSize = (สูงสุด div 8) - (ขั้นต่ำ div 8) + 1,

โดยที่ค่าสูงสุดและต่ำสุดคือขอบเขตบนและล่างของประเภทฐานของชุดนี้

หมายเลขไบต์สำหรับองค์ประกอบเฉพาะ E คำนวณโดยสูตร:

ByteNumber = (E div 8) - (ขั้นต่ำ div 8)

จำนวนบิตภายในไบต์นี้ตามสูตร:

BitNumber = E mod 8

ลำดับการเขียนองค์ประกอบของเซตภายในตัวสร้างไม่สำคัญ ตัวอย่างเช่น และ เป็นเซตที่เทียบเท่ากัน

แต่ละองค์ประกอบในชุดจะถูกนับเพียงครั้งเดียว ดังนั้นเซตจึงเทียบเท่ากัน

ตัวแปรหลายประเภทมีคำอธิบายดังนี้:
วาร์<идентификатор>: ชุดของ<базовый тип>;

ตัวอย่างเช่น:

Var A, D: ชุดของไบต์; B: เซตของ "a".."z"; C: ชุดของบูลีน;

คุณไม่สามารถป้อนค่าลงในตัวแปรหลายตัวด้วยขั้นตอนการป้อนข้อมูลและส่งออกค่าเหล่านั้นด้วยขั้นตอนการส่งออก

ตัวแปรหลายตัวสามารถกำหนดค่าเฉพาะได้โดยการรันตัวดำเนินการกำหนด:
<множественная переменная> := <множественное выражение>;

ตัวอย่างเช่น:

ก: = ;B: = ["ม", "n", "k"]; ค: = ; ด:=ก;

นอกจากนี้ นิพจน์สามารถรวมการดำเนินการของชุดไว้ด้วย

ตั้งค่าการดำเนินการ

สมาคมสองชุด A และ B เป็นชุดที่ประกอบด้วยองค์ประกอบที่รวมอยู่ในชุด A หรือ B อย่างน้อยหนึ่งชุด เครื่องหมายสำหรับการดำเนินการรวมใน Pascal คือ "+"

1) + => 2) +['a'..'z']+['A'..'E', 'k'] => ['A'..'E', 'a'.. 'z']3) + =>

โดยการข้ามสองชุด A และ B เป็นชุดที่ประกอบด้วยองค์ประกอบที่รวมอยู่ในชุด A และชุด B พร้อมกัน

ป้ายดำเนินการทางแยกภาษาปาสคาล “*”

1) * => 2) ['a'..'z']*['A'..'E', 'k'] => ['k']3) * =>

โดยความแตกต่างชุด A และ B สองชุดเป็นชุดที่ประกอบด้วยองค์ประกอบของชุด A ที่ไม่รวมอยู่ในชุด B

1a) - => 1b) - => 2a) ['a'..'z']-['A'..'E', 'k'] => ['a'..'j', ' ฉัน'..'z']2b) ['A'..'E', 'k'] - ['a'..'z'] => ['A'..'E']3a) - => 3b) - =>

การดำเนินการรายการ- นี่คือการดำเนินการที่สร้างการเชื่อมต่อระหว่างชุดและปริมาณสเกลาร์ซึ่งมีประเภทเกิดขึ้นพร้อมกับประเภทฐานของชุด ถ้า x เป็นปริมาณสเกลาร์และ M เป็นเซต การดำเนินการเกิดขึ้นจะถูกเขียนดังนี้: x ใน M

ผลลัพธ์จะเป็นค่าตรรกะจริงหากค่า x รวมอยู่ในเซต M มิฉะนั้นจะเป็นเท็จ

ตัวอย่างเช่น 4 นิ้วเป็นจริง 5 นิ้วเป็นเท็จ

เมื่อใช้การดำเนินการนี้ คุณจะไม่เพียงแต่สามารถทำงานกับองค์ประกอบของเซตเท่านั้น แต่ยังสามารถทำงานกับเซตต่างๆ ในการแก้ปัญหาได้อย่างชัดเจน นิพจน์เชิงตรรกะบางส่วนสามารถเขียนได้กระชับมากขึ้น

1) จำนวนธรรมชาติ n เป็นตัวเลขสองหลัก แทนที่จะเป็นการแสดงออก (n >= 10) และ (n<=99) สามารถเขียนลงไปได้ ไม่เป็นไร.

2) สัญลักษณ์ c เป็นอักษรรัสเซีย แทนที่จะเป็นการแสดงออก (ค >= 'A') และ (ค<= ‘Я’) or (c>='a') และ (ค<=‘п’) or (c>='p') และ (ค<=‘я’) เราเขียน c ใน ['A'.. 'ฉัน', 'a'.. 'p', 'r'.. 'i']ฯลฯ

คุณสามารถเพิ่มองค์ประกอบใหม่ให้กับชุดโดยใช้การดำเนินการแบบรวม ตัวอย่างเช่น a:= a+ กระบวนการรวมมีไว้สำหรับวัตถุประสงค์เดียวกันใน Turbo Pascal 7.0: รวม (M, A) M คือเซต A คือตัวแปรชนิดเดียวกับองค์ประกอบของเซต M ตัวอย่างเดียวกันสามารถเขียนได้ดังนี้: รวม (a, 5)

คุณสามารถแยกองค์ประกอบออกจากชุดได้โดยใช้การดำเนินการ "ชุดความแตกต่าง" ตัวอย่างเช่น a:= a- กระบวนการแยกมีจุดประสงค์เพื่อจุดประสงค์เดียวกันใน Turbo Pascal 7.0: ไม่รวม (M, A) M คือเซต A คือตัวแปรประเภทเดียวกับองค์ประกอบของเซต M ตัวอย่างเดียวกันสามารถเขียนได้ดังนี้ ไม่รวม (a, 5)

ลองดูตัวอย่างการใช้ชุดต่างๆ ในการแก้ปัญหา

ภารกิจที่ 1ไม่มีสถาบันการศึกษาระดับสูงในเมืองที่ซื้ออุปกรณ์คอมพิวเตอร์ มีบริษัทคอมพิวเตอร์หกแห่ง: Dialog, Avicom, Neta, Server, Dekada, Dega.ru ตอบคำถามต่อไปนี้:
1) แต่ละมหาวิทยาลัยซื้อสินค้าจากบริษัทใดบ้าง?
2) บริษัทใดที่ซื้อโดยมหาวิทยาลัยอย่างน้อยหนึ่งแห่ง?
3) มหาวิทยาลัยแห่งใดซื้อคอมพิวเตอร์จากบริษัทใดบ้าง?

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

คำตอบสำหรับคำถามแรกสามารถหาได้จากการตัดกันเซตดังกล่าวทั้งหมด

คำตอบสำหรับคำถามที่สองคือผลลัพธ์ของการรวมเซต

และสุดท้าย สำหรับข้อสุดท้าย ความแตกต่างระหว่างกลุ่มของบริษัททั้งหมดและกลุ่มบริษัทที่มหาวิทยาลัยอย่างน้อยหนึ่งแห่งทำการซื้อ

โปรแกรม ex_set_1;พิมพ์ Firma = ชุด 1..6; v = array of firma;const f: array of string = ("Dialogue", "Avicom", "Neta", "Server", "Decade", "Dega.ru"); (ขั้นตอนการป้อนข้อมูลเกี่ยวกับการซื้อ คอมพิวเตอร์สำหรับ Firma ถัดไป) ขั้นตอน vvod(var a: Firma);var i: byte; ตอบ: 0..1;เริ่ม:= ; สำหรับ i:= 1 ถึง 6 จะเริ่มเขียน("มหาวิทยาลัยซื้อคอมพิวเตอร์จากบริษัท ", f[i], " (1 - ใช่, 0 - ไม่ใช่)? "); ReadLn(ใช่); if ans = 1 ดังนั้น a:=a+[i] end;end;(ขั้นตอนสำหรับการพิมพ์องค์ประกอบอาร์เรย์ที่มีตัวเลขอยู่ในชุด) ขั้นตอน Print(a: Firma);var i: byte;begin for i:= 1 to 6 ทำถ้าฉันอยู่ในแล้ว write(f[i]:10); writelnend;(ขั้นตอนที่ตอบคำถามแรก)ขั้นตอน Rez1(a: v; n: byte; var b: Firma);var i: byte;begin b:= ; for i:= 0 ถึง n-1 do b:= b * a[i];end;(ขั้นตอนที่ตอบคำถามที่สอง)ขั้นตอน Rez2(a: v; n: byte; var b: Firma);var i : ไบต์; เริ่มต้น b:= ; สำหรับ i:= 0 ถึง n-1 do b:= b + a[i];end;var a: v; n, i: ไบต์; c: Firma;begin write("มีมหาวิทยาลัยกี่แห่งที่ซื้อสินค้านี้?"); อ่าน(n); สำหรับ i:= 0 ถึง n-1 ทำ vvod(a[i]); เรซ1(ก, เอ็น, ค); writeln("แต่ละมหาวิทยาลัยซื้อคอมพิวเตอร์จากบริษัท: "); พิมพ์(ค); เรซ2(ก, เอ็น, ค); writeln("มหาวิทยาลัยอย่างน้อยหนึ่งแห่งซื้อคอมพิวเตอร์จากบริษัท: "); พิมพ์(ค); writeln("ไม่มีมหาวิทยาลัยใดซื้อคอมพิวเตอร์จากบริษัท: "); พิมพ์(-c);จบ.

ภารกิจที่ 2สร้าง nชุด (การนับเริ่มจาก 1) องค์ประกอบการพิมพ์ที่รวมอยู่ในชุดทั้งหมดโดยมีตัวเลขหารด้วยสามลงตัว แต่ไม่รวมอยู่ในชุดแรก

โปรแกรม ex_set_2;พิมพ์ mn = ชุดของไบต์; v = array ของ mn;(ขั้นตอนการป้อนข้อมูลลงในชุดถัดไป) ขั้นตอน vvod(var a: mn);var i, n, vsp: byte;begin a:= ; n:= 1 +สุ่ม(200); สำหรับ i:= 1 ถึง n จะเริ่มต้น vsp:= สุ่ม (256); a:=a+ end;end;(ขั้นตอนสำหรับการพิมพ์องค์ประกอบชุด)ขั้นตอน Print(a: mn);var i: byte;begin for i:= 0 ถึง 255 do if i in a then write(i:4); writelnend;(ขั้นตอนที่ตอบคำถาม)ขั้นตอน Rez(a: v; n: byte; var b: mn);var i: byte;begin b:= ; ฉัน:= 3; ในขณะที่ฉัน<= n do begin b:= b * a[i]; i:= i + 3 end; b:= b - aend;var a: v; n, i: byte; c: mn;begin randomize; write("Сколько множеств? "); readln(n); for i:= 1 to n do begin vvod(a[i]); print (a[i]) end; Rez(a, n, c); Print(c);end.

โปรแกรม ex_set_3;var m: ชุดของถ่าน; ส:สตริง; i: ไบต์; เริ่มเขียน ("ป้อนสตริง: "); อ่านแล้ว; ม:=; ฉัน:= 1; ในขณะที่ฉัน<= length(s) do if s[i] in m then delete(s, i, 1) else begin m:=m+]; i:= i + 1 end; writeln(s)end.

42. โปรแกรมสำหรับค้นหาจำนวนอักขระเฉพาะในข้อความ

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

โปรแกรม pr28;

const ใช่=1; (ค่าคงที่ที่กำหนดว่า )

ไม่=0; (อักขระปัจจุบันขององค์ประกอบคำ)

STR:สตริง;

ตอนนี้ (จำนวนคำ)

nc, (จำนวนตัวอักษร)

ในคำ:จำนวนเต็ม; (ตัวแปรที่รับค่า

ค่าคงที่ YES หรือ NO)

ฉัน:จำนวนเต็ม;

writeln("กรอกตัวอักษร:");

อ่าน(str);

nw:=0;nc:=0;ในคำ:=NO;

สำหรับ i:=1 ถึง length(str) do

nc:=nc+1;

ถ้า str[i] ใน [///,".",","", "!", "";", "] (ถ้าตัวคั่น)

จากนั้น inword:=NO (ดังนั้นอักขระปัจจุบันอยู่นอกคำ)

ถ้า inword=NO แล้ว

เริ่มต้นในคำ:=ใช่;

ใหม่:=nw+1;

writeln("nc=",nc,"nw=",nw);


43. ประเภทข้อมูลอักขระในภาษา Turbo Pascal