2013-04-05 6 views
3

양방향 버블 정렬 코딩 숙제가 있습니다. 내 논리가 그것에 관해 정확한지 누군가가 볼 수 있습니까? 코드를 내가 원하는대로 만들고 싶지는 않습니다. 나는 그것을 이해하는 방법에 대한 논리 점검을 원한다.양방향 버블 정렬 C#

양방향 버블 정렬을 이해하면 목록의 위치 1에서 시작하여 일반적인 버블 정렬을 수행하는 루프 2 개를 구현합니다. 첫 번째 for 루프가 끝나면 두 번째 루프가 역으로 작동하도록 구현됩니다. 각 루프의 종료 조건이 무엇인지 완전히 이해하지 못합니다.

for 루프 조건은 다음과 같습니까?

루프 1 - for(i = 0; i < Count -i; i++)

루프 2 - 교환 조건이 지정 될 각 루프 for(j = Count - i; j > i; j--)

.

감사

+0

최고 종류의 비디오 : http://www.youtube.com/watch?v=SJwEwA5gOkM –

+0

이것은 아마도 http://programmers.stackexchange.com/ 또는 http://codereview.stackexchange.com/ 질문 일 것입니다. –

+0

@TiesonT. "프로그래머"가 적합 할지라도, "codereview"는 OP에 의해 작성된 코드의 완전하고 작동 가능한 부분을 필요로합니다. – dasblinkenlight

답변

3

은 "고전적인"버블 정렬은 각 반복의 전체 배열을 통과하므로 루프가 두 루프가 하나의 인덱스를 건너

for(i = 0; i < Count - 1; i++) 

for(j = Count - 1; j > 0; j--) 

해야한다 : 첫 번째 루프는 마지막 인덱스를 건너 뛰고 두 번째 루프는 첫 번째 루프를 건너 뜁니다. 이는 코드가 data[i]data[i+1]과 안전하게 비교하고 data[j]data[j-1]과 안전하게 비교할 수 있도록하기위한 것입니다.

EDIT"optimized" 버블 정렬 k 번째 반복에 초기 k 요소를 생략.

int k = 0; 
do { // The outer loop 
    ... 
    for(int i = k; i < Count - k - 1; i++) 
     ... 
    for(int j = Count - k - 1; j > k ; j--) 
     ... 
    k++; 
} while (<there were swaps>); 
+0

역 반복은 첫 번째 루프의 위치에 의존하지 않습니다. 루프 1이 이미 루프를 검사 했는데도 항상 위치 1로 이동합니까? – user2046257

+1

@ user2046257 첫 번째 루프에 배열의 일부분을 움직여서 배열의 부분을 이동 시켰습니다. 버블 정렬의 비 효율성에 대한 이유입니다. – dasblinkenlight

+1

기술적으로 첫 번째 패스 (예 : 위아래) 이후에 더 이상 첫 번째 요소 또는 마지막 요소를 알 필요가 없습니다 가장 낮은 요소와 가장 높은 요소가되도록 항상 0에서 시작해야하는 것은 아니며 j는 항상 0에서 끝나지 않아도됩니다. – Xantix

2

양방향 버블 정렬은 다음과 같이 작동합니다 :

을 대신 바닥에서 목록을 전달하는 당신의 거품 정렬은 양방향이기 때문에,이 같은 초기 k 꼬리 k 요소를 건너 뛸 수있을 것입니다 (bubble sort)을 할 때마다 상단의부터 및 번으로 을 한 번씩 두 번씩 시작합니다.

위키 피 디아 문서에서는 설명에 더 나은 방법 일을 :

http://en.wikipedia.org/wiki/Cocktail_sort

- 풍부한