이것은 인터뷰 질문이기 때문에 과일 스톨은 배열이라고 가정합니다. 배열을 여덟 개의 영역으로 나눕니다. 각 영역은 첫 번째 영역을 제외한 각 영역의 시작 부분까지 7 개의 포인터를 사용하여 주어진 유형의 열매만을 포함합니다. 정렬되지 않은 영역의 시작 부분을 가리 키기 위해 여덟 번째 포인터를 사용하십시오.
포인터를 초기화하여 배열의 시작 부분을 가리 키도록하십시오. 포인터의 정의를 얻는 것은 까다로운 작업입니다. 왜냐하면 주어진 유형의 결실이없는 경우를 처리해야하기 때문입니다. 하나의 가능한 정의는 포인터 i가 i = 1..8에 대해 i까지의 유형으로 분류 된 과일 수를 포함한다는 것입니다. 그런 다음 처음에는 모든 포인터가 0과 1로 설정됩니다. 1 1 2 2 3 4 4 | p1 = 3 p2 = 5 p3 = 6 p4 = 8 p5 = p6 = p7 = p8 = 8
정렬되지 않은 영역의 시작 부분에있는 첫 번째 과일을 반복적으로보고 유형을 찾습니다. 최종 영역에 들어가서는 안되는 경우 최종 영역의 시작 부분에서 요소와 바꿔 포인터를 최종 영역의 시작 부분으로 이동하십시오. 두 번째 마지막 영역으로 이동해서는 안되는 경우 두 번째 마지막 영역의 시작 부분에있는 요소와 교체하고 두 번째 마지막 영역의 시작 부분으로 포인터를 이동합니다 ... 새 과일이 올바른 위치에 올 때까지 계속합니다. . 이제 첫 번째 정렬되지 않은 과일로 포인터를 이동하고 반복하십시오.
이것은 각 과일을 한 번 보았습니다. getType() 호출 횟수를 줄이면 정렬 할 수 있다고 생각하지 않습니다. 당신은 스왑의 수를 신경 쓰지 않아, 이것이 최적이라고 생각합니다.
나는 c1, c2, c1, c3, c2, c1, c4, c4로 시작하는 스왑을 보여주는 행을 넣을 것입니다.나는 cs에 글쓰기를 귀찮게하지 않을 것이고 나는 | 유형이 알려지지 않은 오른쪽 영역에서부터 모든 것이 알려진 순서대로 왼쪽에있는 영역을 나눕니다.
| 1 2 1 3 2 1 4 4
1 | 2 1 3 2 1 4 4
1 2 | 1 3 2 1 4 4
1 1 | 2 3 2 1 4 4
1 1 | 3 2 1 4 4
1 1 2 3 | 2 1 4 4
1 1 2 2 | 3 1 4 4
1 1 2 2 3 | 1 4 4
1 1 2 2 1 | 3 4 4
1 1 2 2 | 3 4 4
1 1 2 2 3 | 4 4
1 1 2 2 3 4 | 4
1 1 2 2 3 4 4 |
답장을 보내 주셔서 감사합니다. 그러나 나는 여기서 몇 가지 것을 이해할 수 없다. {1,2,3,4,5,6,7,8} 배열이 {c1, c2, c1, c3, c2, c1, c4, c4}와 같은 배열이라고 가정 해 보겠습니다. 내가 arr [7]에 arr [1]을 가리키는 (p1-p7) 7 개의 다른 포인터가 필요하다는 것을 의미합니다. 어디에서 최종 포인터 p8을 가리켜 야합니까? 또한이 예제를 통해 다음과 같이 설명 할 수 있습니까? "최종 영역에 들어가면 안되면 최종 영역의 시작 부분에있는 요소로 바꿔 포인터를 최종 영역의 시작 부분으로 이동하십시오.". –
나는 당신의 예제를 통해 작업 했으므로 어디서 무엇이 바뀌는 지 알 수 있습니다. 처음 7 개 포인터는 지금까지 주문한 섹션에 다른 유형의 영역 경계가 어디에 있는지 보여줍니다. 여덟 번째 포인터는 정렬 된 데이터와 순서가 지정되지 않은 데이터의 경계를 보여줍니다. 포인터의 정의에 대한 자세한 내용은 코드 작성 방법에 따라 다릅니다. – mcdowella
고마워, 정말 도움이되었다! –