การคัดเลือกการเลือกอย่างง่าย: (เลือกค่าต่ำสุดวางไว้ก่อนจากนั้นบิตแรกจะเลื่อนไปข้างหลังดังนั้นลูป) บิตแรกเปรียบเทียบกับแต่ละอันหลังจากนั้นแต่ละครั้งแต่ละครั้งที่บิตที่เล็กที่สุดจะได้รับและบิตแรกกลับไปข้างหลัง โปรโมต (นั่นคือตัวเลขแรกที่เลือกคือค่าต่ำสุดไม่ได้มีส่วนร่วมในการเปรียบเทียบอีกต่อไปจำนวนการเปรียบเทียบจะลดลง 1)
ความซับซ้อน: จำนวนการดำเนินการที่จำเป็นในการเคลื่อนไหวบันทึกคือ 0--3 (N-1) / 2. ความซับซ้อนของเวลาทั้งหมดคือ O (N2);
ความซับซ้อนของพื้นที่ o (1)
การปรับปรุงอัลกอริทึม: ทุกครั้งที่คุณเปรียบเทียบมันคือการใส่ค่าที่เล็กที่สุดในสถานที่แรกดังนั้นคุณสามารถเปรียบเทียบได้จนจบค้นหาค่าต่ำสุดและวางไว้โดยตรงในสถานที่แรกกำจัดการสลับและการเคลื่อนไหวที่ไม่มีความหมาย นอกจากนี้คุณยังสามารถเปลี่ยนทิศทางเปรียบเทียบบิตสุดท้ายกับแต่ละอันก่อนหน้าและทำให้ค่าสูงสุดด้านล่างในแต่ละครั้งและผลักบิตสุดท้ายไปข้างหน้า
ซอร์สโค้ด Java:
การคัดลอกรหัสมีดังนี้:
โมฆะคงที่สาธารณะเลือก Selectsort (วันที่ [] วัน) {
int min;
อุณหภูมิวันที่;
สำหรับ (int i = 0; i <days.length; i ++) {
min = i;
สำหรับ (int j = min+1; j <days.length; j ++) {
ถ้า (วัน [min]. compare (วัน [j])> 0) {
min = j;
-
-
ถ้า (min! = i) {
อุณหภูมิ = วัน [i];
วัน [i] = วัน [นาที];
วัน [ขั้นต่ำ] = อุณหภูมิ;
-
-
-
วันที่คลาส {
int ปี, เดือน, วัน;
วันที่ (int y, int m, int d) {
ปี = y;
เดือน = M;
วัน = d;
-
INT Public Compare (วันที่) {
ส่งคืน> วันที่?
: วันที่> วันที่ 1: เดือน <date.month?
: วันที่> วันที่?
-
Public Void Print () {
System.out.println (ปี + "" + เดือน + "" + วัน);
-
-
การเลือกแบบง่าย ๆ :
การเลือกการเลือกอย่างง่ายนั้นคล้ายกับการเรียงลำดับฟอง (การเรียงลำดับฟอง) ความแตกต่างเพียงอย่างเดียวคือการเรียงลำดับฟองสลับตำแหน่งขององค์ประกอบทุกครั้งที่พบว่ามันมีขนาดเล็กกว่า (หรือมากกว่า) มากกว่าค่าปัจจุบันในขณะที่การเลือกการเลือกอย่างง่ายคือการเลือกค่ามากที่สุดในองค์ประกอบที่เหลือและแลกเปลี่ยนข้อมูลที่ ตำแหน่งปัจจุบัน
ตัวอย่างเช่นสำหรับชุดองค์ประกอบ r = {37, 40, 38, 42, 461, 5, 7, 9, 12}
ในลำดับแรก: 37 มีการแลกเปลี่ยนโดยตรงกับ 5 สร้างลำดับใหม่ R1 = {5,40,38,42,461,37,7,9,12}}
ในลำดับที่สอง: 40 มีการแลกเปลี่ยนโดยตรงกับ 7 สร้างลำดับใหม่ R2 = {5,7,38,42,461,37,40,9,12}}}
และอื่น ๆ จนถึงองค์ประกอบสุดท้าย (หมายเหตุ: ในลำดับที่สอง 38 มีขนาดเล็กกว่า 42 แต่พวกเขาไม่แลกเปลี่ยนข้อมูล)
นี่คือเวอร์ชันการใช้งาน Java ที่เพียงแค่เลือกการเรียงลำดับ:
การคัดลอกรหัสมีดังนี้:
การเลือกโมฆะแบบคงที่สาธารณะ (ข้อมูล int []) {
if (data == null || data.length <= 1)
กลับ;
int i, j, ค่า, minpos, len = data.length;
int outer = len - 1, tmp;
สำหรับ (i = 0; i <ด้านนอก; i ++) {
value = data [i];
minpos = -1;
สำหรับ (j = i+1; j <len; j ++) {
if (data [j] <ค่า) {
minpos = j;
value = data [j];
-
-
ถ้า (minpos! = -1) {
tmp = data [i];
ข้อมูล [i] = ค่า;
ข้อมูล [minpos] = tmp;
-
// สำหรับ (int k = 0; k <len; k ++) {
// system.out.print (data [k] + ",");
-
// system.out.println ();
-
-
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {
int [] coll = {
37, 40, 38, 42, 461, 5, 7, 9, 12
-
SelectionSort (Coll);
สำหรับ (int i = 0; i <coll.length; i ++) {
System.out.print (coll [i] + ",");
-
-
เรียงลำดับการเลือกต้นไม้
อัลกอริธึมการคัดแยกการเลือกต้นไม้เป็นอัลกอริทึมทั่วไปที่แลกเปลี่ยนพื้นที่สำหรับเวลาเมื่อเทียบกับการเรียงลำดับการเลือกอย่างง่าย ความคิดคือการรักษาองค์ประกอบ N ที่เรียงลำดับสร้างค่อนข้างเล็ก (N+1)/2 ตัวเลขจากนั้นสร้างตัวเลข [N+1]/4 ที่ค่อนข้างเล็กจนกระทั่งมีองค์ประกอบเดียวเท่านั้น สร้างขึ้นเป็นต้นไม้ไบนารีอย่างสมบูรณ์
เมื่อเรียงลำดับองค์ประกอบที่เล็กที่สุด
นี่คือเวอร์ชันการใช้งาน Java ของการคัดแยกการเลือกต้นไม้:
การคัดลอกรหัสมีดังนี้:
Public Static Void Treeselectionort (int [] ข้อมูล) {
if (data == null || data.length <= 1)
กลับ;
int len = data.length, low = 0, i, j;
// เพิ่มพื้นที่เสริม
int [] tmp = new int [2*len -1];
int tsize = tmp.length;
// สร้างต้นไม้
สำหรับ (i = len-1, j = tmp.length-1; i> = 0; i-, j-) {
tmp [j] = data [i];
-
สำหรับ (i = tsize -1; i> 0; i- = 2) {
tmp [(I-1)/2] = tmp [i]> tmp [I-1]?
-
//จบ
// ลบโหนดขั้นต่ำ
ในขณะที่ (ต่ำ <len) {
ข้อมูล [ต่ำ ++] = TMP [0];
สำหรับ (j = tsize-1; tmp [j]! = tmp [0]; j--);
tmp [j] = integer.max_value;
ในขณะที่ (j> 0) {
ถ้า (j%2 == 0) {// ถ้าเป็นโหนดที่ถูกต้อง
tmp [(j-1)/2] = tmp [j]> tmp [j-1]? tmp [j-1]: tmp [j];
j = (j-1)/2;
} else {// ถ้าเป็นโหนดซ้าย
TMP [J/2] = TMP [J]> TMP [J+1]?
j = j/2;
-
-
-
-
เมื่อสร้างต้นไม้ไบนารีที่สมบูรณ์ต้องใช้พื้นที่เสริม 2*N -1 สำหรับการรวบรวมองค์ประกอบ N
รหัส:
การคัดลอกรหัสมีดังนี้:
ในขณะที่ (j> 0) {
ถ้า (j%2 == 0) {// ถ้าเป็นโหนดที่ถูกต้อง
tmp [(j-1)/2] = tmp [j]> tmp [j-1]? tmp [j-1]: tmp [j];
j = (j-1)/2;
} else {// ถ้าเป็นโหนดซ้าย
TMP [J/2] = TMP [J]> TMP [J+1]?
j = j/2;
-
-
จากนั้นใช้การก่อสร้างแบบเรียกซ้ำของค่าต่ำสุดในชุดใหม่