様々な大企業で採用面接を経験し、よく使用されるソートアルゴリズムについて解説します。
配列のクイックソート
import java.util.Arrays;
import java.util.Random;
public class SortExample {
public static void main(String[] args) {
int[] numbers = new int[10];
Random rand = new Random();
for (int i = 0; i < 10; i++) {
numbers[i] = rand.nextInt(10);
System.out.print(numbers[i] + " ");
}
System.out.println();
Arrays.sort(numbers);
for (int number : numbers) {
System.out.print(number + " ");
}
}
}
ここでは、Arrays.sort(numbers)を使用して配列をソートしています。
カスタムオブジェクトのクイックソート
カスタムオブジェクトのソートは、Collections.sort(persons, new Comparator<Person>()を使用して行います。
import lombok.Data;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class CustomSortExample {
public static void main(String[] args) {
List<Person> persons = new ArrayList<>();
persons.add(new Person(10, 198, "アリババ"));
persons.add(new Person(11, 189, "テンセント"));
persons.add(new Person(12, 180, "バイトダンチュイン"));
persons.add(new Person(12, 181, "バイトダンチュイン"));
Collections.sort(persons, new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
if (p1.getAge() != p2.getAge()) {
return Integer.compare(p2.getAge(), p1.getAge());
} else {
return Integer.compare(p2.getHeight(), p1.getHeight());
}
}
});
}
}
@Data
class Person {
private int age;
private int height;
private String name;
}
辞書順ソート
compare(o1, o2)の戻り値:負数→o1が先、ゼロ→順序変更なし、正数→o1が後o1.compareTo(o2)はJavaのデフォルトの辞書順比較で、Unicodeコードポイントに基づいています。- 最終的なソート結果は辞書順で昇順となります:数字→小文字→同じタイプの文字はaからzまで順に並びます。
import java.util.*;
public class DictionarySortExample {
public static void main(String[] args) {
List<String> strings = new ArrayList<>();
strings.add("ertyuy");
strings.add("iooik");
strings.add("1");
System.out.println(strings);
Collections.sort(strings, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
});
System.out.println(strings);
}
}