C언어 학습(13) 삽입정렬, 힙정렬, 병합정렬

선생님께서 가르쳐주시는 분류법에 대해 깊이 이해하고 있습니다. 다 설명할 시간이 없었지만, 점차 개선해 나가고 있습니다. 격려해 드리고 싶습니다!

#include <stdio.h>
#define MAX 10

typedef 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); }










 

Supongo que te gusta

Origin blog.csdn.net/ls_dashang/article/details/81516014
Recomendado
Clasificación