선생님께서 가르쳐주시는 분류법에 대해 깊이 이해하고 있습니다. 다 설명할 시간이 없었지만, 점차 개선해 나가고 있습니다. 격려해 드리고 싶습니다!
#include <stdio.h>
#define MAX 10typedef int ARR[MAX];
typedef int Elementype;
void swap(ARR arr,int i,int j);//매개변수 값 교환
void insert(ARR arr);//Insert sort
void shell(ARR arr); // 힐 정렬
void print(ARR arr);//인쇄 함수
void heap(ARR arr);//힙 정렬 본문
void heapadjust(ARR arr,int n,int m);//힙 정렬 초기화 함수void mergesort2(ARR arr,int left,int right)//재귀 병합 정렬
void swap(ARR arr,int i,int j)//交换函数
{ int temp = arr[i]; arr[i] = arr[j]; arr[j] = 온도; }
void insert(ARR arr)//Insertion sort
{ int i,j; for(i = 1;i < MAX;i++) { if(arr[i-1] > arr[i])//이것 사이의 차이점을 판단합니다. bit 및 이전 비트의 크기 { Elementtype temp = arr[i];//결정할 위치를 기록합니다 for(j = i - 1;j >= 0;j--) { if(arr[j] > temp) arr[j +1] = arr[j];//이전 위치가 다음 위치보다 크면 이전 비트를 다음 비트에 덮어쓰고 이 판단을 반복합니다. else break ; } arr[j + 1 ] = temp;//판정할 위치보다 크지 않을 때까지 이 위치의 다음 비트에 할당 print(arr); } } }
void shell(ARR arr)//Hill 정렬, 삽입 정렬을 기반으로 배열을 순서대로 재그룹화하고 그룹 내에서 삽입 정렬을 수행한 다음 그룹 수가 1이 될 때까지 더 적은 수의 그룹으로 정렬합니다(그룹 수는 2^n+입니다). 또는 -1, 즉 1,3,5,7,9,15,17....)
{ int a[] = {1,3,5};//그룹 수 기록 int k = 2 ; int step = a[k];//다음 루프에서 다른 수의 그룹 사용 int i,j; while(k >= 0) { for(i = step;i < MAX;i++) { if (arr [i - step] > arr[i])//5개의 그룹으로 나누면 0번과 5번이 그룹으로 정렬되고, 1번과 6번이 그룹으로 정렬됩니다.... . { Elementype temp = arr [i]; for(j = i-step;j >= 0;j -= step)//스텝 크기는 그룹 수입니다. 동일한 그룹의 두 요소는 단계별로 구분됩니다. 삽입 정렬을 사용하여 생각을 결정합니다. { if(arr[j] > 임시) {
arr[j + step] = arr[j];
}
else
break;
}
arr[j+step] = temp;
}
}
step = a[--k];//다음 그룹 번호 삽입 정렬을 수행합니다.
print( 도착 );
}
}
void heapadjust(ARR arr,int n,int m)
{ 요소 유형 temp = arr[n];//부모 값 기록 int i; for(i = 2*n+1;i <= m;i = 2 *i +1) { if(i < m && arr[i] < arr[i + 1])//왼쪽 및 오른쪽 하위 트리의 크기 비교 i++; if( arr [i] < temp)// 부모와 함께 더 큰 것 break ; arr[n] = arr[i];//자식이 크면, 자식은 부모 n = i를 덮어씁니다; } arr[n] = temp;//작은 부모의 값을 다음 위치에 넣습니다. 아이의 입장 }
void heap(ARR arr)
{ int i; for(i = (MAX-2)/2;i >= 0;i--)//초기화 { heapadjust(arr,i,MAX-1);//힙 처리 , 결국 큰 상위 힙을 형성함 } print(arr); printf("**************\n"); for(i = MAX-1;i > 0;i-- ) { swap(arr,0,i);//끝에 최대값을 넣습니다. heapadjust(arr,0,i-1);//트리의 범위를 줄여 다시 큰 상위 힙을 형성합니다(최대값 제외). 값) 인쇄(arr); } }
void meige(ARR arr,int left,int mid,int right)//병합
{ int len = right-left+1; 요소 유형 temp[len]; int k = 0; int i = left;//of 이전 그룹 첫 번째 int j = mid+1;//첫 번째 while(i <= mid && j <= right) { if(arr[i] < arr[j]) { temp[k++] = arr[i++] ;//첫 번째 숫자를 비교하고, 더 작은 숫자를 배열에 넣은 후 비교를 위해 다음 숫자를 가져옵니다.} else { temp [k++] = arr[j++];//예를 들어 첫 번째 숫자가 다음 숫자보다 높습니다. one 그룹의 첫 번째 것이 작아서 배열에 넣은 후 i++는 후자를 다음 그룹과 비교합니다. 그룹 내 정렬이 완료되었으므로 그룹 간의 숫자만 정렬됩니다.} } while ( i < = mid) { temp[ k++] = arr[i++];//나머지 숫자를 배열에 넣습니다 }
while(j <= right)
{ temp[k++] = arr[j++];//나머지 숫자를 배열에 넣습니다 } for (i = 0;i < len;i++) arr[left+i] = temp[ i ];//임시 배열을 원래 배열에 넣습니다 . }void mergesort1(ARR arr)//비재귀 병합 정렬
{ int left,right,mid; int i; for(i = 1;i < MAX;i *= 2) { left = 0; while(left + i < MAX)//제약 조건은 정렬을 위해 배열에 적어도 하나의 그룹이 형성될 수 있다는 것입니다. { mid = left+i-1;//i는 각 그룹의 길이이고, mid는 첫 번째 그룹의 꼬리입니다. right = ( mid+i )<(MAX-1)?(mid+i):(MAX-1);//right는 두 번째 그룹의 꼬리 표시입니다 merge(arr,left,mid,right);//병합 호출 연속된 두 개를 병합하는 함수 그룹 간의 크기 정렬, 첫 번째는 인접 요소 정렬, 두 번째는 두 그룹 정렬, 그룹 정렬 left = right+1; } print( arr ) ; } }
void mergesort2(ARR arr, int left, int right)//재귀 병합 정렬, 아이디어는 그룹 내에서 병합 및 정렬한 다음 그룹 간에 병합 및 정렬하는 것입니다. { if (left == right)
{ return ; } int mid = (left+right)/2; mergesort2(arr,left,mid);//왼쪽 절반 그룹은 그룹 내에서 정렬되며 요소 간의 정렬은 점차적으로 호출되고 반환 값은 mergesort2(arr, mid+ 1, right); merge(arr,left,mid,right);//병합 정렬 함수 호출 print(arr); }