データ構造-ソート・セット
3487 ワード
ソート・タイプ挿入ソート 選択ソート 泡配列(Buble sort) ユニットソート(ユニットソート) 連結ソート(連結ソート) ヒップホップソート、キュー(heap sort,queue) クイックソート、(クイックソート) 基数ソート カウントソート(カウントソート) 1.ソートの挿入
コンセプト
手にしたカードを整理する方式を切り口とし、あるカードを整理する際に、特定のカードを順番に並べたカードと比較して、特定のカードの位置を特定する.
コード#コード#
時間の複雑さ
O(n^2)
くうかんふくざつさ
O(n)
特長
アレイが小さいほど効率が向上
2.ソート選択(select sort)
コンセプト
配列の最上位値を探し、順番に並べ替えます.
コード#コード#
時間の複雑さ
O(n^2)
くうかんふくざつさ
O(n)
3.バブルソート(Buble sort)
コンセプト
隣接する2つのインデックス(j,j+1)を比較し,順次並べ替えた.
コード#コード#
時間の複雑さ
O(n^2)
くうかんふくざつさ
O(n)
特長
配列が整うほど効率が上がる
4.セルのソートコンセプト
挿入ソート(insert sort)の補完は、挿入ソートに対して隣接するindex+1しか移動できず、移動する位置が遠くなるほどコスト(write)の問題を解決する方法は である.
へいきんじかんふくざつさ
O(n^1.5)
くうかんふくざつさ
O(n)
特長
交換が必要な値が遠く離れている場合は、挿入ソートよりもコストがかかります.
5.連結ソート(連結ソート)
7.クイックソート、(クイックソート)
8.基数ソート
9.カウントソート
コンセプト
手にしたカードを整理する方式を切り口とし、あるカードを整理する際に、特定のカードを順番に並べたカードと比較して、特定のカードの位置を特定する.
コード#コード#
void insertSort(int arr[], int n) {
int key, i, j;
for (i = 1; i < n; i++) {//index 1 부터 모두 확인
key = arr[i];
for (j = i - 1; j >= 0 && key < arr[j]; j--) { // key의 값보다 크면 인덱스를 +1 이동
arr[j + 1] = arr[j];
}// 아니라면 그 위치가 key가 있어야할 위치
arr[j + 1] = key; //외부에서 j를 정의했기 때문에 for문 밖에서도 사용가능
}
}
時間の複雑さ
O(n^2)
くうかんふくざつさ
O(n)
特長
アレイが小さいほど効率が向上
コンセプト
配列の最上位値を探し、順番に並べ替えます.
コード#コード#
void selectSort(int arr[], int n) {
int indexMin, temp; // 최솟값 인덱스
for (int i = 0; i < n - 1; i++) {
indexMin = i;
for (int j = i + 1; j < n; j++) {
if (arr[indexMin] > arr[j]) {
indexMin = j;
}
}
temp = arr[i];
arr[i] = arr[indexMin];
arr[indexMin] = temp;
}
}
時間の複雑さ
O(n^2)
くうかんふくざつさ
O(n)
コンセプト
隣接する2つのインデックス(j,j+1)を比較し,順次並べ替えた.
コード#コード#
void bubbleSort(int arr[], int n) {
int temp;
for (int i = 0; i < n; i++) {//회수
for (int j = 0; j < n - 1-i;j++) {
if (arr[j] > arr[j + 1]) {// 인접한 인덱스 비교
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
時間の複雑さ
O(n^2)
くうかんふくざつさ
O(n)
特長
配列が整うほど効率が上がる
挿入ソート(insert sort)の補完は、挿入ソートに対して隣接するindex+1しか移動できず、移動する位置が遠くなるほどコスト(write)の問題を解決する方法は
void shellSort(int arr[], int n) {
int i, k, j, gap, value;
for (gap = n / 2; gap > 0; gap /= 2) {
if (gap % 2 == 0) {
gap++;
}
for (i = 0; i < gap; i++) { // gap으로 나눈 기준까지
for (j = i + gap; j < n; j += gap) { //인덱스 정렬 시작
value = arr[j]; // 기준이 되는 인덱스 이자, 변경할 값
for (k = j - gap; k >= i && arr[k] > value; k -= gap) {//기준이 되는 j의 인덱스 아래로 정렬진행
arr[k + gap] = arr[k]; // 값들을 순차대로 정렬
}
arr[k + gap] = value; // 맨 마지막 값을 업데이트 해줌!!
}
}
}
}
へいきんじかんふくざつさ
O(n^1.5)
くうかんふくざつさ
O(n)
特長
交換が必要な値が遠く離れている場合は、挿入ソートよりもコストがかかります.
void merge(int arr[], int first, int mid, int last) {
int i, j, k, l;
i = first;
j = mid + 1;
k = first;
while (i <= mid && j <= last) {
if (arr[i] > arr[j]) {
sort[k++] = arr[j++];
}
else {
sort[k++] = arr[i++];
}
}
if (i > mid) {// i쪽만 값을 넣었을때 j의 값을 모두 넣는다.
for (l = j; l <= last; l++) {
sort[k++] = arr[l];
}
}
else {
for (l = i; l <= mid; l++) {
sort[k++] = arr[l];
}
}
for (l = first; l <= last; l++) {
arr[l] = sort[l];
}
}
void mergeSort(int arr[], int first, int last) {
int mid;
if (first < last) {
mid = (first + last) / 2;
mergeSort(arr, first, mid);
mergeSort(arr, mid + 1, last);
merge(arr, first, mid, last);
}
}
6.お尻の位置合わせ、キュー(heap sort、queue)7.クイックソート、(クイックソート)
8.基数ソート
9.カウントソート
Reference
この問題について(データ構造-ソート・セット), 我々は、より多くの情報をここで見つけました https://velog.io/@kdhangelic/자료구조-정렬-모음テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol