Це найменший виклик операцій, де метою є сортування вектора у порядку зростання за допомогою найменших обернень. Ваш алгоритм може тільки сортувати вектор з допомогою «суб-вектор розвороти» 1 , але він може використовувати інші операції для арифметичних операцій, петлі, перевірка , якщо він впорядкований і т.д. Число суб-вектора сторнування ваш алгоритм виконує є його оцінка.
1 "Реверсування субвектора":
- Виберіть діапазон чисел у векторі та переверніть елементи в цьому діапазоні.
Якщо навести простий приклад, якщо ви почнете з вектора {4,3,2,1}
, то ви можете його сортувати багатьма різними способами:
- Перевернути весь вектор. Це, очевидно, найкоротший підхід, оскільки він вимагає лише одного звороту:
{4,3,2,1} -> {1,2,3,4}
- Ви можете зробити версію сортування бульбашок, для якої потрібно 6 перетворень:
{4,3,2,1} -> {3,4,2,1} -> {3,2,4,1} -> {2,3,4,1} -> {2,3,1,4} -> {2,1,3,4} -> {1,2,3,4}
- Ви можете почати з перших трьох елементів, потім трьох останніх і, нарешті, двох перших та двох останніх, для чого потрібні 4 підкачки:
{4,3,2,1} -> {2,3,4,1} -> {2,1,4,3} -> {1,2,4,3} -> {1,2,3,4}
- ... і так далі. Існує нескінченна кількість варіантів (ви можете повторити будь-яку операцію, якщо хочете).
Правила та вимоги:
Ваш код повинен заповнити менше ніж за одну хвилину для списку зі 100 номерами. Ви можете самі це зробити, але будь ласка, пограйте справедливо 2 .
Ви повинні зберігати початкові та кінцеві індекси всіх здійснених свопів, щоб рішення було перевірене. (Я поясню, що це означає нижче).
Код повинен бути детермінованим.
Ви можете взяти вхід у будь-якому форматі, який ви хочете: Числовий вектор, зв'язаний список, масив з довжиною ... що завгодно.
Ви можете робити все, що завгодно, на копії вектора. Це включає спроби різних розворотів та перевірку, який є найбільш ефективним. Брут-форсинг - це прекрасно, але дотримуйтесь часового обмеження.
Оцінка - це загальна кількість фліп для 5 тестових векторів. Штамп-датчик матиме позначку дати.
Приклад:
4 1 23 21 49 2 7 9 2 | Початковий вектор / список 4 1 2 9 7 2 49 21 23 | (2, 8) (перевернув елементи між індексами 2 і 8) 4 1 2 2 7 9 49 21 23 | (3, 5) 4 1 2 2 7 9 23 21 49 | (6, 8) 4 1 2 2 7 9 21 23 49 | (6, 7) 2 2 1 4 7 9 21 23 49 | (0, 3) 1 2 2 4 7 9 21 23 49 | (0, 2)
Оцінка складе 6, оскільки ви виконали 6 перетворень. Ви повинні зберігати (не друкувати) індекси, перелічені праворуч, у відповідному форматі, який можна легко роздрукувати / вивести для перевірки.
Тестові вектори:
133, 319, 80, 70, 194, 333, 65, 21, 345, 142, 82, 491, 92, 167, 281, 386, 48, 101, 394, 130, 111, 139, 214, 337, 180, 24, 443, 35, 376, 13, 166, 59, 452, 429, 406, 256, 133, 435, 446, 304, 350, 364, 447, 471, 236, 177, 317, 342, 294, 146, 280, 32, 135, 399, 78, 251, 467, 305, 366, 309, 162, 473, 27, 67, 305, 497, 112, 399, 103, 178, 386, 343, 33, 134, 480, 147, 466, 244, 370, 140, 227, 292, 28, 357, 156, 367, 157, 60, 214, 280, 153, 445, 301, 108, 77, 404, 496, 3, 226, 37
468, 494, 294, 42, 19, 23, 201, 47, 165, 118, 414, 371, 163, 430, 295, 333, 147, 336, 403, 490, 370, 128, 261, 91, 173, 339, 40, 54, 331, 236, 255, 33, 237, 272, 193, 91, 232, 452, 79, 435, 160, 328, 47, 179, 162, 239, 315, 73, 160, 266, 83, 451, 317, 255, 491, 70, 18, 275, 339, 298, 117, 145, 17, 178, 232, 59, 109, 271, 301, 437, 63, 103, 130, 15, 265, 281, 365, 444, 180, 257, 99, 248, 378, 158, 210, 466, 404, 263, 29, 117, 417, 357, 44, 495, 303, 428, 146, 215, 164, 99
132, 167, 361, 145, 36, 56, 343, 330, 14, 412, 345, 263, 306, 462, 101, 453, 364, 389, 432, 32, 200, 76, 268, 291, 35, 13, 448, 188, 11, 235, 184, 439, 175, 159, 360, 46, 193, 440, 334, 128, 346, 192, 263, 466, 175, 407, 340, 393, 231, 472, 122, 254, 451, 485, 257, 67, 200, 135, 132, 421, 205, 398, 251, 286, 292, 488, 480, 56, 284, 484, 157, 264, 459, 6, 289, 311, 116, 138, 92, 21, 307, 172, 352, 199, 55, 38, 427, 214, 233, 404, 330, 105, 223, 495, 334, 169, 168, 444, 268, 248
367, 334, 296, 59, 18, 193, 118, 10, 276, 180, 242, 115, 233, 40, 225, 244, 147, 439, 297, 115, 354, 248, 89, 423, 47, 458, 64, 33, 463, 142, 5, 13, 89, 282, 186, 12, 70, 289, 385, 289, 274, 136, 39, 424, 174, 186, 489, 73, 296, 39, 445, 308, 451, 384, 451, 446, 282, 419, 479, 220, 35, 419, 161, 14, 42, 321, 202, 30, 32, 162, 444, 215, 218, 102, 140, 473, 500, 480, 402, 1, 1, 79, 50, 54, 111, 189, 147, 352, 61, 460, 196, 77, 315, 304, 385, 275, 65, 145, 434, 39
311, 202, 126, 494, 321, 330, 290, 28, 400, 84, 6, 160, 432, 308, 469, 459, 80, 48, 292, 229, 191, 240, 491, 231, 286, 413, 170, 486, 59, 54, 36, 334, 135, 39, 393, 201, 127, 95, 456, 497, 429, 139, 81, 293, 359, 477, 404, 129, 129, 297, 298, 495, 424, 446, 57, 296, 10, 269, 350, 337, 39, 386, 142, 327, 22, 352, 421, 32, 171, 452, 2, 484, 337, 359, 444, 246, 174, 23, 115, 102, 427, 439, 71, 478, 89, 225, 7, 118, 453, 350, 109, 277, 338, 474, 405, 380, 256, 228, 277, 3
Я досить впевнений, що знайти оптимальне рішення - непросто (оскільки регулярне сортування млинців є).
2 Так, люди з дуже швидкими комп’ютерами можуть мати перевагу через обмеження часу в одну хвилину. Після довгого обговорення я зрозумів, що найкраще, якщо кожен робить власний бенчмаркінг, це не найшвидший виклик коду.
n-1
перевертаннями? Я можу лише довести нижню межу приблизно 50.