Skip to content

Instantly share code, notes, and snippets.

@fpdjsns
Last active October 13, 2016 07:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fpdjsns/91c71ae97c341679b179a6cd35056917 to your computer and use it in GitHub Desktop.
Save fpdjsns/91c71ae97c341679b179a6cd35056917 to your computer and use it in GitHub Desktop.
학생 정보(학번, 이름, 성적)을 입력받아 성적 순 학번 순으로 퀵정렬
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
#define MAX 100
typedef struct student
{
int hakbun; //학번
char name[40]; //이름
int score; //성적
}student;
//배열 교환
void EXCHANGE(student* arr, int a, int b)
{
student temp;
temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
//(정렬할 배열, 하한, 상한, 1(학번) or 2(성적)
void QuickSort(student *arr, int m, int n, int num)
{
int i = m; //상한
int j = n; //하한
int pivot = m; //key값 index
if (m < n){ //상한이 하한보다 낮은 경우
while (1){
if (num == 1) //학번
{
while (arr[i].hakbun < arr[pivot].hakbun)i++; //큰 수 찾기
while (arr[j].hakbun > arr[pivot].hakbun)j--; //작은 수 찾기
if (i < j){
EXCHANGE(arr, i, j); //두 값 교환
}
else{ //작은 값이 큰 값보다 뒤에 있을 경우
EXCHANGE(arr, j, pivot); //pivot과 작은 값을 교환
break; //반복문종료
}
}
else //성적(내림차순 정렬)
{
while (arr[i].score > arr[pivot].score)i++; //작은 수 찾기
while (arr[j].score < arr[pivot].score)j--; //큰 수 찾기
if (i < j){
EXCHANGE(arr, i, j); //두 값 교환
}
else{ //작은 값이 큰 값보다 뒤에 있을 경우
EXCHANGE(arr, i, pivot); //pivot과작은값을교환
break; //반복문 종료
}
}
}
QuickSort(arr, m, j - 1, num); //pivot 왼쪽 배열 정렬
QuickSort(arr, j + 1, n, num); //pivot 오른쪽 배열 정렬
}
}
void main(){
student s[MAX];
int i = 0; //반복문변수
int num;
char ch[40];
printf("학생 수를 입력하세요 : ");
scanf("%d", &num);
//학생 정보 입력
for (i = 0; i < num; i++)
{
printf("학생 정보 입력(학번, 이름, 성적) : ");
scanf("%d", &s[i].hakbun);
scanf("%s", ch);
strcpy(s[i].name, ch);
scanf("%d", &s[i].score);
}
printf("성적 순 학생 출력\n");
QuickSort(s, 0, num - 1, 2); //퀵 소트(학생 배열,0,num-1,2)
for (i = 0; i < num; i++)
printf("%d\t%s\t%d\n", s[i].hakbun, s[i].name, s[i].score);
printf("\n");
printf("학번 순 학생 출력\n");
QuickSort(s, 0, num - 1, 1); //퀵 소트(학생 배열,0,num-1,1)
for (i = 0; i < num; i++)
printf("%d\t%s\t%d\n", s[i].hakbun, s[i].name, s[i].score);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment