EASY7

[c언어] 다양한 SORT 방법(insert / merge) 본문

개발 공부/C

[c언어] 다양한 SORT 방법(insert / merge)

E.asiest 2017. 10. 4. 17:54

merge sort

 #include<stdio.h>
#include<stdlib.h>
void display(int* A, int n);
void merge(int A[], int p, int q, int r);
void mergeSort(int A[], int p, int r);
void copyArray(int *A, int *temp, int p, int r);
int main()
{
    int n;
    int *A;
    int i;
 
    printf("배열의 길이를 입력하세요:");
    scanf("%d", &n);
    A = (int*)malloc(sizeof(int) * n);
 
    for (i = 0; i < n; i++)
    {
        printf("%d번째 배열의 원소를 입력하세요:", i + 1);
 
        scanf("%d", &A[i]);
    }
 
    printf("정렬 전:\n");;
    display(A, n);
 
    mergeSort(A, 0, n - 1);
    printf("정렬 후:\n");
    display(A, n);
    free(A);
}
 
void mergeSort(int A[], int p, int r)
{
    int q;
 
    if (p == r) return;
 
    q = (p + r) / 2;
    mergeSort(A, p, q);
    mergeSort(A, q + 1, r);
    merge(A, p, q, r);
}
void merge(int A[], int p, int q, int r)
{
    int i = p, j = q + 1, k;
    int *temp = (int*)malloc(sizeof(int) * (r - p + 1));
 
    if (!temp) printf("메모리를 할당할 수 없습니다.");
    for (k = 0; k < r - p + 1; k++)
    {
        while (i > q)
        {
            if (j > r)
            {
                copyArray(A, temp, p, r);
                free(temp);
                return;
            }
            temp[k] = A[j];
            k++;
            j++;
 
        }
        while (j > r)
        {
            if (i > q)
            {
                copyArray(A, temp, p, r);
                free(temp);
                return;
            }
            temp[k] = A[i];
            k++;
            i++;
 
        }
 
        if (A[i] < A[j])
        {
            temp[k] = A[i];
            i++;
        }
        else
        {
            temp[k] = A[j];
            j++;
        }
 
    }
    copyArray(A, temp, p, r);
 
}
void display(int* A, int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        printf("%d ", A[i]);
    }
    printf("\n");
}
 
void copyArray(int *A, int *temp, int p, int r)
{
    int i;
    int j = 0;
    for (i = p; i <= r; i++)
    {
        A[i] = temp[j];
        j++;
    }
}

 

 

insert sort

#include<stdio.h>
insertionSort(int *A, int n)
{
    int i, j, k, temp;
    for (i = 1; i < n; i++)
    {
        for (j = 0; j < i; j++) {
            if (A[j] > A[i]) break;//>:오름차순 <:내림차순
        }
 
       
        temp = A[i];//A[i]인지 A[j]인지 판단
        for (k = i; k > j; k--)
        {
            A[k] = A[k - 1];
 
        }
        A[j] = temp;
 
 
    }
}
void display(int* A, int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        printf("%d ", A[i]);
 
    }
    printf("\n");
}
int main()
{
    int A[5] = { 3,5,4,2, 6 };
    printf("정렬 전:\n");
    display(A, 5);
    insertionSort(A, 5);
    printf("정렬 후:\n");
    display(A, 5);
}

 

quick sort

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void quickSort(struct Student s[], int p, int r);
int partition(struct Student s[], int p, int r);
void print_array(struct Student s[], int n);
void swqp(struct Student s[], int i, int j);
struct Student
{
 int id;
 int english;
 int math;
 int korean;
};

int main()
{
 struct Student* s;
 int n;
 int i;
 srand(time(NULL));
 printf("학생의 수를 입력하세요:");
 scanf("%d", &n);
 s = (struct Student*)malloc(sizeof(struct Student) * n);
 if (!s)
 {
  printf("메모리를 할당할 수 없습니다.");
  return 0;
 }
 for (i = 0; i < n; i++)
 {
  s[i].id = i + 1;
  s[i].english = rand() % 101;
  s[i].math = rand() % 101;
  s[i].korean = rand() % 101;
 }
 quickSort(s, 0, n-1);


}

void quickSort(struct Student s[], int p, int r)
{
 int q;
 if (p >= r) return;
 q = partition(s, p, r);
 quickSort(s, p, q - 1);
 quickSort(s, q + 1, r);

}
void swap(struct Student s[], int i, int j)
{
 struct Student temp;
 temp = s[i];
 s[i] = s[j];
 s[j] = temp;

}
int partition(struct Student s[], int p, int r)
{
 int i = -1, j = 0;
 while (p != r)
 {
  if (s[j].korean < s[r].korean)
  {
   swap(i + 1, j);
   i++;
   j++;
  }
  else
   j++;

 }
 swap(i + 1, r);
 return i + 1;
}

void print_array(struct Student s[], int n)
{
 int i;
 printf("        id     korean    english        math\n");
 for (i = 0; i < n; i++)
 {
  printf("%10d %10d %10d %10d", s[i].id, s[i].korean, s[i].english, s[i].math);
  printf("\n");
 }

}

 

 

 

 

'개발 공부 > C' 카테고리의 다른 글

[C언어] 다항식 더하기  (0) 2017.10.04
[c언어] file open  (0) 2017.10.04
[c언어] 순환 / 큰 값으로 만들어주는 길 찾기  (0) 2017.10.04
memorization / 피보나치 수열  (0) 2017.10.04
memorization / 조합 combination  (0) 2017.10.04
Comments