게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
오름차순 셸 정렬에 관해서..
게시물ID : programmer_14195짧은주소 복사하기
작성자 : 더럽혀진우연
추천 : 0
조회수 : 424회
댓글수 : 1개
등록시간 : 2015/10/31 17:12:46
옵션
  • 베스트금지
  • 본인삭제금지
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void output_sort(int * list, int n)
{
int i = 0;
int j = 0;
int temp = 0;
int index = 0;

for ( i = 0; i < n; i++ )
{
index = i;
for ( j = i; j < n; j++ )
{
if ( list[index] > list[j] )
{
index = j;
}
}
temp = list[index];
list[index] = list[i];
list[i] = temp;
}

}


void shell_sort(int *list, int n, int mode) //n = size
{

int i, j, k;
// 분할된 배열에서 시작지점
int start;
int next;
int gap = n;
int data[20];
int count = 0;

char path[20] = "hw1.out";

FILE *files;
if (mode == 0)
{
files = fopen(path, "w+") ;
}
else
files = fopen(path, "a+") ;

fflush(files);

if (files == NULL)
{
printf(" FILE OPEN ERROR! \n");
return;
}

do
{
gap /= 2;

for (start=0; start<gap; start++)
{
count = 0;
// 삽입정렬 알고리즘
for (i=start; i<n; i+=gap)
{
next = list[i];


for(j=i-gap; j>=0 && list[j] > next; j-=gap)
{
list[j+gap] = list[j];
}
data[count++] = next;

list[j+gap] = next;

}

output_sort(data, count);


for (k = 0; k < count; k++)
{
fprintf(files, "%d ", data[k]);
printf("%d ",data[k]);
}

fprintf(files, "\n");
printf("\n");
}

} while (gap > 1);

fclose(files);

}

void shell_add(int *list, int n, int *list2, int n2, int * output) //n = size
{
int i = 0;
int j = 0;
int count = 0;

char path[20] = "hw1.out";

FILE *files;
files = fopen(path, "a+") ;

fflush(files);

if (files == NULL)
{
printf(" FILE OPEN ERROR! \n");
return;
}

for(i = 0 ;i < n ; i++)
{
if (list[i] < list2[j])
{
output[count] = list[i];
count++;
}
else
{
output[count] = list2[j];
count++;
j++;
i--;
}

if (j >= n2)
{
break;
}
}

if (i < n)
{
for ( ; i < n; i++)
{
output[count] = list[i];
count++;
}
}

if (j < n2)
{
for ( ; j < n2; j++)
{
output[count] = list2[j];
count++;
}
}

for (i = 0; i < count; i++)
{
printf("%d ", output[i]);
fprintf(files, "%d ", output[i]);
}
printf("\n");
fprintf(files, "\n");

printf("*\n");
fprintf(files, "*\n");

fclose(files);
}


int main()
{
char path[20] = "hw1.inp";
int data[2][20] = {0};
int LineCount[2] = { 0};
int output[40] = {0};
char *save;
char *s;
char buf[512];
int count = 0;
int h_count = 0;
char delim[] = " \t\n"; /* 문자열을 나누는 기준 (공백, 텝, 엔트) */
int i = 0;
int j = 0;
char tmp_set;

FILE *files;
files = fopen(path, "r+") ;

if (files == NULL)
{
printf(" FILE OPEN ERROR! \n");
return 0;
}

for (i = 0; i < 2; i++)
{
for (j = 0; j < 20; j++)
{

fscanf(files, "%d", &data[i][j]);
fscanf(files, "%c", &tmp_set);

if (tmp_set == '\n')
break;
if (tmp_set == '*')
break;
}

LineCount[i] =j+1;
}



for (i = 0; i < 2 ;i++)
shell_sort(data[i], LineCount[i], i);

shell_add(data[0], LineCount[0], data[1], LineCount[1], output);

fclose(files);

return 0;
}
-- 소스는 다음과 같고
hw1.inp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
*
일때.
10 20
9 19
8 18
7 17
6 16
5 15
4 14
3 13
2 12
1 11
5 10 15 20
4 9 14 19
3 8 13 18
2 7 12 17
1 6 11 16
1 3 5 7 9 11 13 15 17 19
2 4 6 8 10 12 14 16 18 20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
0 -858993460 1 ~ 20
*
이렇게 나옵니다. 뭐가 문제인지 짚어주시면 감사하겠습니다.
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호