อัลกอริธึมการเรียงลำดับของคลาสคอนเทนเนอร์ใน Java JDK ส่วนใหญ่ใช้การเรียงลำดับการแทรกและการเรียงลำดับแบบผสาน การใช้งานอาจแตกต่างกันในเวอร์ชันที่ต่างกัน รหัสคีย์มีดังนี้:
// การรวมตัว
// ถ้าอาร์เรย์ถูกเรียงลำดับแล้ว - ไม่มีการผสาน
if (((เปรียบเทียบได้<Object>) ใน[med - 1]).compareTo(ใน[med]) <= 0) {
System.arraycopy(ใน, เริ่มต้น, ออก, เริ่ม, len);
กลับ;
-
int r = แพทย์, i = เริ่มต้น;
// ใช้การรวมเข้ากับการค้นหาแบบเอกซ์โปเนนเชียล
ทำ {
เปรียบเทียบได้<วัตถุ> fromVal = (เปรียบเทียบ<วัตถุ>) ใน[เริ่มต้น];
เปรียบเทียบ<วัตถุ> rVal = (เปรียบเทียบ<วัตถุ>) ใน[r];
ถ้า (fromVal.compareTo(rVal) <= 0) {
int l_1 = ค้นหา (ใน, rVal, -1, เริ่ม + 1, med - 1);
int toCopy = l_1 - เริ่ม + 1;
System.arraycopy(ใน, เริ่มต้น, ออก, i, toCopy);
ฉัน += เพื่อคัดลอก;
ออก [i++] = rVal;
ร++;
เริ่มต้น = l_1 + 1;
} อื่น {
int r_1 = ค้นหา (ใน, fromVal, 0, r + 1, สิ้นสุด - 1);
int toCopy = r_1 - r + 1;
System.arraycopy(ใน, r, ออก, i, toCopy);
ฉัน += เพื่อคัดลอก;
ออก[i++] = จากVal;
เริ่ม++;
ร = r_1 + 1;
-
} ในขณะที่ ((สิ้นสุด - r) > 0 && (med - เริ่มต้น) > 0);
// คัดลอกส่วนที่เหลือของอาร์เรย์
ถ้า ((จบ - r) <= 0) {
System.arraycopy(ใน, เริ่มต้น, ออก, i, med - เริ่มต้น);
} อื่น {
System.arraycopy(in, r, out, i, end - r);
-
-
ตัวอย่างเช่น {1, 2, 3, 5, 8, 13} จะแสดงด้วยชุดต่อไปนี้:
0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
รหัสเทียมมีดังนี้:
สำหรับ (i ใน [0~n-1]) บิต [i] = 0;
สำหรับ(ฉันอยู่ใน [0~n-1])
ถ้า (ฉันอยู่ในไฟล์อินพุต)
บิต[i] = 1
สำหรับ(ฉันอยู่ใน [0~n-1])
ถ้า (บิต [i] == 1)
เอาท์พุทฉัน
ลองใช้โค้ดจาวาประสิทธิภาพดีมาก:
โมฆะสาธารณะคงที่หลัก (สตริงสุดท้าย [] args) {
รายการ <จำนวนเต็ม> firstNum = ใหม่ ArrayList<จำนวนเต็ม>();
รายการ <จำนวนเต็ม> SecondNum = ใหม่ ArrayList<จำนวนเต็ม>();
สำหรับ (int i = 1; i <= 1000000; i++) {
firstNum.add(i);
SecondNum.add(i);
-
คอลเลกชัน.สับเปลี่ยน(firstNum);
คอลเลกชัน.สับเปลี่ยน(secondNum);
getStartTime();
Collections.sort(firstNum);
getEndTime("เวลารันการเรียงลำดับ Java ");
getStartTime();
SecondNum = ลำดับที่ไม่ซ้ำ (secondNum);
getEndTime("เวลารันการเรียงลำดับเฉพาะ");
-
รายการคงที่สาธารณะ <Integer> UniqueSort (รายการสุดท้าย <Integer> UniqueList) {
javaUniqueSort.tempList.clear();
สำหรับ (int i = 0; i < javaUniqueSort.temp.length; i++) {
javaUniqueSort.temp[i] = 0;
-
สำหรับ (int i = 0; i < UniqueList.size(); i++) {
javaUniqueSort.temp[uniqueList.get(i)] = 1;
-
สำหรับ (int i = 0; i < javaUniqueSort.temp.length; i++) {
ถ้า (javaUniqueSort.temp[i] == 1) {
javaUniqueSort.tempList.add(i);
-
-
กลับ javaUniqueSort.tempList;
-
โมฆะสาธารณะคงที่ getStartTime () {
javaShuffle.start = System.nanoTime();
-
โมฆะสาธารณะคงที่ getEndTime (สตริงสุดท้าย) {
javaShuffle.end = System.nanoTime();
System.out.println(s + ": " + (javaShuffle.end - javaShuffle.start) + "ns");
-
-
เวลาทำงาน:
เวลารันการเรียงลำดับ Java: 1257737334ns
เวลารันการเรียงลำดับที่ไม่ซ้ำกัน: 170228290ns
เวลารันการเรียงลำดับ Java: 1202749828ns
เวลารันการเรียงลำดับที่ไม่ซ้ำกัน: 169327770ns
โมฆะคงที่สาธารณะหลัก (สตริงสุดท้าย [] args) {
สุ่ม สุ่ม = สุ่มใหม่();
รายการ <จำนวนเต็ม> firstNum = ใหม่ ArrayList<จำนวนเต็ม>();
รายการ <จำนวนเต็ม> SecondNum = ใหม่ ArrayList<จำนวนเต็ม>();
สำหรับ (int i = 1; i <= 100000; i++) {
firstNum.add(i);
SecondNum.add(i);
firstNum.add(random.nextInt(i + 1));
SecondNum.add(random.nextInt(i + 1));
-
คอลเลกชัน.สับเปลี่ยน(firstNum);
คอลเลกชัน.สับเปลี่ยน(secondNum);
getStartTime();
Collections.sort(firstNum);
getEndTime("เวลารันการเรียงลำดับ Java ");
getStartTime();
SecondNum = ลำดับที่ไม่ซ้ำ (secondNum);
getEndTime("เวลารันการเรียงลำดับเฉพาะ");
-
รายการคงที่สาธารณะ <Integer> UniqueSort (รายการสุดท้าย <Integer> UniqueList) {
javaDuplicateSort.tempList.clear();
int[] temp = ใหม่ int[200002];
สำหรับ (int i = 0; i < temp.length; i++) {
อุณหภูมิ[i] = 0;
-
สำหรับ (int i = 0; i < UniqueList.size(); i++) {
อุณหภูมิ[uniqueList.get(i)]++;
-
สำหรับ (int i = 0; i < temp.length; i++) {
สำหรับ (int j = temp[i]; j > 0; j--) {
javaDuplicateSort.tempList.add(i);
-
-
กลับ javaDuplicateSort.tempList;
-
โมฆะสาธารณะคงที่ getStartTime () {
javaShuffle.start = System.nanoTime();
-
โมฆะสาธารณะคงที่ getEndTime (สตริงสุดท้าย) {
javaShuffle.end = System.nanoTime();
System.out.println(s + ": " + (javaShuffle.end - javaShuffle.start) + "ns");
-
-