Java JDK のコンテナ クラスのソート アルゴリズムは主に挿入ソートとマージ ソートを使用します。キー コードは次のとおりです。
// マージ
// 配列がすでにソートされている場合 - マージは行われません
if (((Comparable<Object>) in[med - 1]).compareTo(in[med]) <= 0) {
System.arraycopy(in, start, out, start, len);
戻る;
}
int r = 中間、i = 開始;
// 指数関数的検索とのマージを使用します
する {
Comparable<Object> fromVal = (Comparable<Object>) in[start];
Comparable<Object> rVal = (Comparable<Object>) in[r];
if (fromVal.compareTo(rVal) <= 0) {
int l_1 = find(in, rVal, -1, start + 1, med - 1);
int toCopy = l_1 - 開始 + 1;
System.arraycopy(in, start, out, i, toCopy);
i += コピーする;
out[i++] = rVal;
r++;
開始 = 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 += コピーする;
out[i++] = fromVal;
開始++;
r = r_1 + 1;
}
while ((end - r) > 0 && (med - start) > 0);
// 配列の残りの部分をコピーする
if ((end - r) <= 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
疑似コードは次のとおりです。
for (i in [0~n-1]) ビット[i] = 0;
for(i in [0~n-1])
if (入力ファイル内の i)
ビット[i] = 1
for(i in [0~n-1])
if(ビット[i] == 1)
出力i
Java コードで試してみると、効率は非常に優れています。
public static void main(final String[] args) {
List<Integer> firstNum = new ArrayList<Integer>();
List<Integer> SecondNum = new ArrayList<Integer>();
for (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();
秒数 = uniqueSort(秒数);
getEndTime("uniqueSort 実行時間 ");
}
public static List<Integer> uniqueSort(final List<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++) {
if (javaUniqueSort.temp[i] == 1) {
javaUniqueSort.tempList.add(i);
}
}
javaUniqueSort.tempListを返します。
}
public static void 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");
}
}
実行時間:
Java ソート実行時間: 1257737334ns
uniqueSort 実行時間: 170228290ns
Java ソート実行時間: 1202749828ns
uniqueSort 実行時間: 169327770ns
public static void main(final String[] args) {
ランダム ランダム = new Random();
List<Integer> firstNum = new ArrayList<Integer>();
List<Integer> SecondNum = new ArrayList<Integer>();
for (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();
秒数 = uniqueSort(秒数);
getEndTime("uniqueSort 実行時間 ");
}
public static List<Integer> uniqueSort(final List<Integer> uniqueList) {
javaDuplicateSort.tempList.clear();
int[] temp = 新しい int[200002];
for (int i = 0; i < temp.length; i++) {
温度[i] = 0;
}
for (int i = 0; i < uniqueList.size(); i++) {
temp[uniqueList.get(i)]++;
}
for (int i = 0; i < temp.length; i++) {
for (int j = temp[i]; j > 0; j--) {
javaDuplicateSort.tempList.add(i);
}
}
javaDuplicateSort.tempListを返します。
}
public static void 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");
}
}