|
|
|
Многофазная сортировка
|
|||
|---|---|---|---|
|
#18+
В книге Макконнела приведен алгоритм: Внешняя многофазная сортировка слиянием Его первая фаза: автор На первом шаге мы прочитаем S записей и отсортируем их с помощью подходящей внутренней сортировки. Этот набор уже отсортированных записей перепишем в файл А. Затем прочитаем еще S записей, отсортируем их и перепишем в файл В. Этот процесс продолжается, причем отсортированные блоки записей пишутся попеременно то в файл А, то в файл В. Вот алгоритм, реализующий первый этап: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. автор После того, как входной файл полностью разбит на отсортированные отрезки, мы готовы перейти ко второму шагу - - слиянию этих отрезков. Каждый из файлов А и В содержит некоторую последова- тельность отсортированных отрезков, однако, как и в случае сортировки слиянием, мы ничего не можем сказать о порядке записей в двух различных отрезках. Процесс слияния будет аналогичен функции MergeLists из § 3.6, однако теперь вместо того, чтобы переписывать записи в новый массив, мы будем записывать их в новый файл. Поэтому мы начинаем с чтения половинок первых отрезков из файлов А и В. Читаем мы лишь по половине отрезков, поскольку мы уже выяснили, что в памяти может находиться одновременно лишь S записей, а нам нужны записи из обоих файлов. Будем теперь сливать эти половинки отрезков в один отрезок файла С. После того, как одна из половинок закончится, мы прочтем вторую половинку из того же файла. Когда обработка одного из отрезков будет завершена, конец второго отрезка будет переписан в файл С. После того, как слияние первых двух отрезков из файлов А и В будет завершено, следующие два отрезка сливаются в файл D. Этот процесс слияния отрезков продолжается с попеременной записью слитых отрезков в файлы С и D. По завершении мы получаем два файла, разбитых на отсортированные отрезки длины 2S. Затем процесс повторяется, причем отрезки читаются из файлов С и D, а слитые отрезки длины 4S записываются в файлы А и В. Ясно, что в конце концов отрезки сольются в один отсортированный список в одном из файлов. Вот алгоритм осуществления второго этапа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2009, 18:48:10 |
|
||
|
Многофазная сортировка
|
|||
|---|---|---|---|
|
#18+
возьмем файл со следующим содержимым: 4 2 9 0 5 1 6 3 8 7 1-й этап: A: 2 4 1 5 7 8 B: 0 9 3 6 C: D: затем: A: 2 4 1 5 7 8 B: 0 9 3 6 C: 0 2 4 9 7 8 D: 1 3 5 6 A: 0 1 2 3 4 5 6 9 B: 7 8 C: 0 2 4 9 7 8 D: 1 3 5 6 A: 0 1 2 3 4 5 6 9 B: 7 8 C: 0 7 1 8 2 3 4 5 6 9 D: В итоге в файле С получаем якобы отсортированную последовательность, что явно не так. Где я ошибся и алгоритм не так понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2009, 18:58:40 |
|
||
|
Многофазная сортировка
|
|||
|---|---|---|---|
|
#18+
proxy1Где я ошибся и алгоритм не так понял? В алгоритме написаноавторпрочитаем S записей Чему у тебя равно S? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2009, 15:15:15 |
|
||
|
Многофазная сортировка
|
|||
|---|---|---|---|
|
#18+
krvsa, Пробовал S=2 и S=4. Просто какой-то момент алгоритма не освещен, видимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2009, 23:25:49 |
|
||
|
Многофазная сортировка
|
|||
|---|---|---|---|
|
#18+
Я для интереса накропал програмульку и все получается... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Вот пример програмульки. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2009, 10:24:15 |
|
||
|
Многофазная сортировка
|
|||
|---|---|---|---|
|
#18+
Может вот так будет более наглядно... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2009, 10:43:58 |
|
||
|
Многофазная сортировка
|
|||
|---|---|---|---|
|
#18+
proxy1A: 0 1 2 3 4 5 6 9 B: 7 8 C: 0 7 1 8 2 3 4 5 6 9 D: Где я ошибся и алгоритм не так понял? Тут s=8 и нужно брать по 4, а не по 1, как ты начал делать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2009, 10:52:29 |
|
||
|
Многофазная сортировка
|
|||
|---|---|---|---|
|
#18+
krvsa, Дело в том, что сама по себе внешняя сортировка применяется по той причине, что в оперативной памяти мало места и поэтому нельзя сразу все данные поместить в нее и отсортировать обычным методом сортировки. В этом алгоритме считается, что доступен объем памяти, вмещающий S элементов: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2009, 12:05:55 |
|
||
|
Многофазная сортировка
|
|||
|---|---|---|---|
|
#18+
proxy1И мне непонятно, каким образом тогда оперировать цепочками 2S, 4S и т.д. Но они-то множат... Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2009, 14:30:55 |
|
||
|
Многофазная сортировка
|
|||
|---|---|---|---|
|
#18+
Сейчас проверил на s=2 и s=4 - не сортирует, если убрать увеличение "шага"... Там получается какое-то "мыло-мочало"... Т.е. повторяющиеся последовательности. ---------- Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2009, 14:35:42 |
|
||
|
Многофазная сортировка
|
|||
|---|---|---|---|
|
#18+
Вот такая фигня получается если просто s=4 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. круг замкнулся... ---------- Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2009, 14:45:29 |
|
||
|
Многофазная сортировка
|
|||
|---|---|---|---|
|
#18+
Если интересно, то вот «Нелинейная» demo реализация сортировки естественным слиянием (Natural Merge Sort) на Visual FoxPro» с картинками. Сейчас пишу тот же самый алгоритм на С++. Кстати, этот алгоритм эффективнее алгоритма, рассматриваемого вами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.01.2010, 15:50:39 |
|
||
|
|

start [/forum/topic.php?fid=16&gotonew=1&tid=1343953]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
286ms |
get topic data: |
10ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 198ms |
| total: | 589ms |

| 0 / 0 |
