#include <stdio.h>
#define MAX 100
void zigzag(int *,int, int *, int *);
void main()
{
int table[MAX], num, rep_no, exchg_no,i;
rep_no = exchg_no=0;
printf("Input Data Number : ");
scanf("%d", &num);
printf("\n Input Data \n");
for(i=0;i<num;i++)
scanf("%d", table+i);
printf("\n\n\t ======= SOURCE DATA ======= \n");
for(i=0;i<num;i++)
{
if(i%10 == 0) printf("\n");
printf("%6d", table[i]);
}
zigzag(table,num,&rep_no, &exchg_no);
printf("\n\n\t\t ======= SORTED DATA =======\n");
for(i=0;i<num;i++)
{
if(i%10 == 0) printf("\n");
printf("%6d", table[i]);
}
printf("\n\n\t\t Repeat count : %5d\n", rep_no);
printf("\t\t Exchange count : %5d\n", exchg_no);
}
void zigzag(int *tbl, int count , int *cnt1, int *cnt2)
{
int left, right, low, high, imsi, temp;
low = 0;
high= count -1;
imsi = 0;
do
{
for(left = low;left<high;left++)
{
if(tbl[left] > tbl[left+1]) //오름차순
{
temp = tbl[left];
tbl[left] = tbl[left+1];
tbl[left+1] = temp;
++*cnt2;
imsi = left;
};
++*cnt1;
};
high = imsi;
for(right = high; right > low; right--)
{
if(tbl[right-1] > tbl[right])
{
temp = tbl[right - 1];
tbl[right-1] = tbl[right];
tbl[right] = temp;
++*cnt2;
imsi = right;
};
++*cnt1;
}
low = imsi;
}
while(low<high);
}
일반 버블 정렬은 한쪽방향으로 실행한다.
이 소스는 양쪽으로 왔다갔다하면서 정렬하는 프로그램
'프로그래머의 길 > 알고리즘' 카테고리의 다른 글
합병 정렬(Merge Sort) 구현 (0) | 2007.04.02 |
---|---|
합병 정렬(Merge Sort) (0) | 2007.04.02 |
버블 정렬(Bubble Sort) (0) | 2007.04.02 |
후위식 계산기 (0) | 2007.03.30 |
원형 큐 구현 소스 (0) | 2007.03.29 |