Java JDK의 컨테이너 클래스 정렬 알고리즘은 주로 삽입 정렬과 병합 정렬을 사용합니다. 버전에 따라 구현이 다를 수 있습니다. 주요 코드는 다음과 같습니다.
// 병합
// 배열이 이미 정렬되어 있는 경우 - 병합하지 않음
if (((Comparable<Object>) in[med - 1]).compareTo(in[med]) <= 0) {
System.arraycopy(in, start, out, start, len);
반품;
}
int r = med, 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 += toCopy;
아웃[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 += toCopy;
아웃[i++] = fromVal;
시작++;
r = r_1 + 1;
}
} while ((end - r) > 0 && (med - start) > 0);
// 나머지 배열 복사
if ((end - r) <= 0) {
System.arraycopy(in, start, out, 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
의사 코드는 다음과 같습니다.
for (i in [0~n-1]) bit[i] = 0;
for(i in [0~n-1])
if(입력 파일의 i)
비트[i] = 1
for(i in [0~n-1])
if(비트[i] == 1)
내가 출력
Java 코드로 시도해 보세요. 효율성이 정말 좋습니다.
공개 정적 무효 메인(최종 문자열[] 인수) {
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();
secondNum = 고유정렬(secondNum);
getEndTime("uniqueSort 런타임");
}
공개 정적 List<Integer> UniqueSort(최종 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를 반환합니다.
}
공개 정적 무효 getStartTime() {
javaShuffle.start = System.nanoTime();
}
공개 정적 무효 getEndTime(최종 문자열 s) {
javaShuffle.end = System.nanoTime();
System.out.println(s + ": " + (javaShuffle.end - javaShuffle.start) + "ns");
}
}
실행 시간:
자바 정렬 런타임: 1257737334ns
UniqueSort 런타임: 170228290ns
자바 정렬 런타임: 1202749828ns
UniqueSort 런타임: 169327770ns
공개 정적 무효 메인(최종 문자열[] 인수) {
무작위 무작위 = 새로운 무작위();
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();
secondNum = 고유정렬(secondNum);
getEndTime("uniqueSort 런타임");
}
공개 정적 List<Integer> UniqueSort(최종 List<Integer> UniqueList) {
javaDuplicateSort.tempList.clear();
int[] 임시 = 새로운 int[200002];
for (int i = 0; i < temp.length; i++) {
온도[i] = 0;
}
for (int i = 0; i < UniqueList.size(); i++) {
임시[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를 반환합니다.
}
공개 정적 무효 getStartTime() {
javaShuffle.start = System.nanoTime();
}
공개 정적 무효 getEndTime(최종 문자열 s) {
javaShuffle.end = System.nanoTime();
System.out.println(s + ": " + (javaShuffle.end - javaShuffle.start) + "ns");
}
}