تستخدم خوارزمية الفرز لفئة الحاوية في Java JDK بشكل أساسي فرز الإدراج وفرز الدمج. قد يختلف التنفيذ في الإصدارات المختلفة. رمز المفتاح هو كما يلي:
// دمج
// إذا كانت المصفوفات مرتبة بالفعل - فلا داعي للدمج
إذا (((Comparable<Object>) in[med - 1]).compareTo(in[med]) <= 0) {
System.arraycopy(in, start, out, start, len);
يعود؛
}
int r = med, i = start;
// استخدم الدمج مع البحث الأسي
يفعل {
Comparable<Object> fromVal = (Comparable<Object>) in[start];
Comparable<Object> rVal = (Comparable<Object>) in[r];
إذا (fromVal.compareTo(rVal) <= 0) {
int l_1 = find(in, rVal, -1, start + 1, med - 1);
int toCopy = l_1 - start + 1;
System.arraycopy(in, start, out, i, toCopy);
i += toCopy;
out[i++] = rVal;
ص++;
البداية = l_1 + 1؛
} آخر {
int r_1 = find(in, fromVal, 0, r + 1, end - 1);
int toCopy = r_1 - r + 1;
System.arraycopy(in, r, out, i, toCopy);
i += toCopy;
out[i++] = fromVal;
ابدأ++;
ص = r_1 + 1؛
}
} while ((end - r) > 0 && (med - start) > 0);
// انسخ بقية المصفوفة
إذا ((النهاية - ص) <= 0) {
System.arraycopy(in, start, out, i, med - start);
} آخر {
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 in [0~n-1]) bit[i] = 0;
ل(أنا في [0 ~ ن-1])
إذا (أنا في ملف الإدخال)
بت [i] = 1
ل(أنا في [0 ~ ن-1])
إذا (بت [i] == 1)
الإخراج ط
جربه باستخدام كود جافا، الكفاءة جيدة حقًا:
public static void main(final String[] args) {
List<Integer> firstNum = new ArrayList<Integer>();
List<Integer> SecondNum = new ArrayList<Integer>();
لـ (int i = 1; i <= 1000000; i++) {
firstNum.add(i);
SecondNum.add(i);
}
Collections.shuffle(firstNum);
Collections.shuffle(SecondNum);
getStartTime();
Collections.sort(firstNum);
getEndTime("وقت تشغيل فرز Java");
getStartTime();
SecondNum = UniqueSort( SecondNum);
getEndTime("وقت التشغيل الفريد");
}
قائمة ثابتة عامة<Integer> UniqueSort(القائمة النهائية<Integer> UniqueList) {
javaUniqueSort.tempList.clear();
for (int i = 0; i < javaUniqueSort.temp.length; i++) {
javaUniqueSort.temp[i] = 0;
}
for (int i = 0; i < UniqueList.size(); i++) {
javaUniqueSort.temp[uniqueList.get(i)] = 1;
}
for (int i = 0; i < javaUniqueSort.temp.length; i++) {
إذا (javaUniqueSort.temp[i] == 1) {
javaUniqueSort.tempList.add(i);
}
}
إرجاع javaUniqueSort.tempList؛
}
الفراغ الثابت العام getStartTime() {
javaShuffle.start = System.nanoTime();
}
public static void getEndTime(final String s) {
javaShuffle.end = System.nanoTime();
System.out.println(s + ": " + (javaShuffle.end - javaShuffle.start) + "ns");
}
}
وقت التشغيل:
وقت تشغيل فرز جافا: 1257737334ns
وقت التشغيل الفريد للفرز: 170228290ns
وقت تشغيل فرز جافا: 1202749828ns
وقت التشغيل الفريد للفرز: 169327770ns
public static void main(final String[] args) {
عشوائي عشوائي = عشوائي جديد ()؛
List<Integer> firstNum = new ArrayList<Integer>();
List<Integer> SecondNum = new ArrayList<Integer>();
لـ (int i = 1; i <= 100000; i++) {
firstNum.add(i);
SecondNum.add(i);
firstNum.add(random.nextInt(i + 1));
SecondNum.add(random.nextInt(i + 1));
}
Collections.shuffle(firstNum);
Collections.shuffle(SecondNum);
getStartTime();
Collections.sort(firstNum);
getEndTime("وقت تشغيل فرز Java");
getStartTime();
SecondNum = UniqueSort( SecondNum);
getEndTime("وقت التشغيل الفريد");
}
قائمة ثابتة عامة<Integer> UniqueSort(القائمة النهائية<Integer> UniqueList) {
javaDuplicateSort.tempList.clear();
int[] temp = new int[200002];
لـ (int i = 0; i < temp.length; i++) {
درجة الحرارة[i] = 0;
}
for (int i = 0; i < UniqueList.size(); i++) {
temp[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();
}
public static void getEndTime(final String s) {
javaShuffle.end = System.nanoTime();
System.out.println(s + ": " + (javaShuffle.end - javaShuffle.start) + "ns");
}
}