連結ソート
9932 ワード
注意:https://gyoogle.dev/blog/algorithm/Quick%20Sort.html
マージソートとも呼ばれ,クイックソート(Quick Sort)などの分割征服法により実現される.安定した順序付け.
*分割征服(Divide and Conquer)法:問題を2つの小さな問題に分けてそれぞれ解決し,結果を元の問題を解決する戦略に集中する.
順序比較でソートするため、リンクリストのソートが必要な場合に有効です.
は半分に並んでいます. 配列の長さを2で割った. の値を比較し、ソートしてマージします. 最適:O(n loḡn) 最悪:O(n loḡn) 平均値:O(n loḡn)
「集計ソート」(Merge Sort)とは?
マージソートとも呼ばれ,クイックソート(Quick Sort)などの分割征服法により実現される.安定した順序付け.
*分割征服(Divide and Conquer)法:問題を2つの小さな問題に分けてそれぞれ解決し,結果を元の問題を解決する戦略に集中する.
順序比較でソートするため、リンクリストのソートが必要な場合に有効です.
プロセス
Java Code (Ascending & Descending)
void mergeSort(int[] arr) {
// 정렬 값들을 저장할 배열 생성
int[] temp = new int[arr.length];
mergeSort(arr, temp, 0, arr.length-1);
}
void mergeSort(int[] arr, int[] temp, int start, int end) {
if (start < end) {
int mid = (start + end) / 2; // 중간 위치를 구한다.
// 구한 중간 위치를 기준으로 나누어 정렬한다.
mergeSort(arr, temp, start, mid);
mergeSort(arr, temp, mid+1, end);
// 정렬이 끝난 배열들을 다시 병합
merge(arr, temp, start, mid, end);
}
}
void merge(int[] arr, int[] temp, int start, int mid, int end) {
// 정렬할 값들을 임시 배열에 담는다.
for (int i=start; i<=end; i++) {
temp[i] = arr[i];
}
int part1 = start; // 왼쪽 부분 포인터
int part2 = mid + 1; // 오른쪽 부분 포인터
int index = start;
while (part1 <= mid && part2 <= end) {
// part1 부분과 part2 부분을 비교하며 정렬 값을 arr에 담고 포인터를 이동한다.
// *Ascending
if (temp[part1] <= temp[part2]) {
// *Descending
if (temp[part1] >= temp[part2]) {
arr[index] = temp[part1];
part1++;
} else {
arr[index] = temp[part2];
part2++;
}
index++;
// 어느 한쪽 부분의 정렬이 먼저 끝날 수 있으므로 나머지 부분을 arr에 담아준다.
for (int i=0; i<=mid-part1; i++) {
arr[index+i] = temp[part1+i];
}
}
}
時間の複雑さ
Reference
この問題について(連結ソート), 我々は、より多くの情報をここで見つけました https://velog.io/@ehcho/병합-정렬Merge-Sortテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol