lua-sort.lua 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976
  1. -- lua-sort
  2. -- Helper function to swap two values in a table
  3. local function swap(arr, i, j)
  4. local temp = arr[i]
  5. arr[i] = arr[j]
  6. arr[j] = temp
  7. end
  8. -- Bubble Sort algorithm
  9. local function bubbleSort(arr)
  10. local n = #arr
  11. for i = 1, n - 1 do
  12. for j = 1, n - i do
  13. if arr[j] > arr[j + 1] then
  14. swap(arr, j, j + 1)
  15. end
  16. end
  17. end
  18. end
  19. -- Insertion Sort algorithm
  20. local function insertionSort(arr)
  21. local n = #arr
  22. for i = 2, n do
  23. local key = arr[i]
  24. local j = i - 1
  25. while j > 0 and arr[j] > key do
  26. arr[j + 1] = arr[j]
  27. j = j - 1
  28. end
  29. arr[j + 1] = key
  30. end
  31. end
  32. -- Selection Sort algorithm
  33. local function selectionSort(arr)
  34. local n = #arr
  35. for i = 1, n - 1 do
  36. local minIndex = i
  37. for j = i + 1, n do
  38. if arr[j] < arr[minIndex] then
  39. minIndex = j
  40. end
  41. end
  42. swap(arr, i, minIndex)
  43. end
  44. end
  45. -- Merge Sort algorithm
  46. local function mergeSort(arr)
  47. local function merge(left, right)
  48. local result = {}
  49. local i = 1
  50. local j = 1
  51. while i <= #left and j <= #right do
  52. if left[i] <= right[j] then
  53. table.insert(result, left[i])
  54. i = i + 1
  55. else
  56. table.insert(result, right[j])
  57. j = j + 1
  58. end
  59. end
  60. for k = i, #left do
  61. table.insert(result, left[k])
  62. end
  63. for k = j, #right do
  64. table.insert(result, right[k])
  65. end
  66. return result
  67. end
  68. local function divide(arr)
  69. if #arr <= 1 then
  70. return arr
  71. end
  72. local mid = math.floor(#arr / 2)
  73. local left = {}
  74. local right = {}
  75. for i = 1, mid do
  76. table.insert(left, arr[i])
  77. end
  78. for i = mid + 1, #arr do
  79. table.insert(right, arr[i])
  80. end
  81. left = divide(left)
  82. right = divide(right)
  83. return merge(left, right)
  84. end
  85. local sortedArr = divide(arr)
  86. for i = 1, #arr do
  87. arr[i] = sortedArr[i]
  88. end
  89. end
  90. -- Quick Sort algorithm
  91. local function partition(arr, low, high)
  92. local pivot = arr[high]
  93. local i = low - 1
  94. for j = low, high - 1 do
  95. if arr[j] <= pivot then
  96. i = i + 1
  97. swap(arr, i, j)
  98. end
  99. end
  100. swap(arr, i + 1, high)
  101. return i + 1
  102. end
  103. local function quickSort(arr, low, high)
  104. if low < high then
  105. local pivot = partition(arr, low, high)
  106. quickSort(arr, low, pivot - 1)
  107. quickSort(arr, pivot + 1, high)
  108. end
  109. end
  110. -- Shell Sort algorithm
  111. local function shellSort(arr)
  112. local n = #arr
  113. local gap = math.floor(n / 2)
  114. while gap > 0 do
  115. for i = gap + 1, n do
  116. local temp = arr[i]
  117. local j = i
  118. while j > gap and arr[j - gap] > temp do
  119. arr[j] = arr[j - gap]
  120. j = j - gap
  121. end
  122. arr[j] = temp
  123. end
  124. gap = math.floor(gap / 2)
  125. end
  126. end
  127. -- Counting Sort algorithm
  128. local function countingSort(arr, minVal, maxVal)
  129. local counts = {}
  130. for i = minVal, maxVal do
  131. counts[i] = 0
  132. end
  133. for i = 1, #arr do
  134. counts[arr[i]] = counts[arr[i]] + 1
  135. end
  136. local sortedIndex = 1
  137. for i = minVal, maxVal do
  138. while counts[i] > 0 do
  139. arr[sortedIndex] = i
  140. sortedIndex = sortedIndex + 1
  141. counts[i] = counts[i] - 1
  142. end
  143. end
  144. end
  145. -- Heap Sort algorithm
  146. local function heapSort(arr)
  147. local n = #arr
  148. local function heapify(arr, n, i)
  149. local largest = i
  150. local left = 2 * i
  151. local right = 2 * i + 1
  152. if left <= n and arr[left] > arr[largest] then
  153. largest = left
  154. end
  155. if right <= n and arr[right] > arr[largest] then
  156. largest = right
  157. end
  158. if largest ~= i then
  159. swap(arr, i, largest)
  160. heapify(arr, n, largest)
  161. end
  162. end
  163. for i = math.floor(n / 2), 1, -1 do
  164. heapify(arr, n, i)
  165. end
  166. for i = n, 2, -1 do
  167. swap(arr, 1, i)
  168. heapify(arr, i - 1, 1)
  169. end
  170. end
  171. -- Radix Sort algorithm
  172. local function radixSort(arr)
  173. local function countingSortByDigit(arr, exp)
  174. local counts = {}
  175. for i = 0, 9 do
  176. counts[i] = 0
  177. end
  178. for i = 1, #arr do
  179. local digit = math.floor(arr[i] / exp) % 10
  180. counts[digit] = counts[digit] + 1
  181. end
  182. for i = 1, 9 do
  183. counts[i] = counts[i] + counts[i - 1]
  184. end
  185. local output = {}
  186. for i = #arr, 1, -1 do
  187. local digit = math.floor(arr[i] / exp) % 10
  188. output[counts[digit]] = arr[i]
  189. counts[digit] = counts[digit] - 1
  190. end
  191. for i = 1, #arr do
  192. arr[i] = output[i]
  193. end
  194. end
  195. local maxVal = math.max(unpack(arr))
  196. local exp = 1
  197. while math.floor(maxVal / exp) > 0 do
  198. countingSortByDigit(arr, exp)
  199. exp = exp * 10
  200. end
  201. end
  202. -- Introsort algorithm
  203. local function introsortSort(arr, low, high, maxDepth)
  204. if high - low <= 16 then
  205. insertionSort(arr, low, high)
  206. elseif maxDepth == 0 then
  207. heapSort(arr, low, high)
  208. else
  209. local pivot = partition(arr, low, high)
  210. introsortSort(arr, low, pivot - 1, maxDepth - 1)
  211. introsortSort(arr, pivot + 1, high, maxDepth - 1)
  212. end
  213. end
  214. local function introSort(arr)
  215. local maxDepth = math.floor(math.log(#arr, 2))
  216. introsortSort(arr, 1, #arr, maxDepth)
  217. end
  218. -- Block Sort algorithm
  219. local function blockSort(arr)
  220. local blockSize = math.floor(math.sqrt(#arr))
  221. -- Divide the array into blocks
  222. local blocks = {}
  223. for i = 1, #arr, blockSize do
  224. local block = {}
  225. for j = i, math.min(i + blockSize - 1, #arr) do
  226. table.insert(block, arr[j])
  227. end
  228. table.insert(blocks, block)
  229. end
  230. -- Sort each block
  231. for _, block in ipairs(blocks) do
  232. insertionSort(block)
  233. end
  234. -- Merge the sorted blocks
  235. local result = {}
  236. while #blocks > 0 do
  237. local minBlock = 1
  238. for i = 2, #blocks do
  239. if blocks[i][1] < blocks[minBlock][1] then
  240. minBlock = i
  241. end
  242. end
  243. table.insert(result, blocks[minBlock][1])
  244. table.remove(blocks[minBlock], 1)
  245. if #blocks[minBlock] == 0 then
  246. table.remove(blocks, minBlock)
  247. end
  248. end
  249. -- Update the original array with the sorted result
  250. for i = 1, #arr do
  251. arr[i] = result[i]
  252. end
  253. end
  254. -- Timsort algorithm
  255. local MIN_MERGE = 32
  256. local function calculateMinRun(n)
  257. local r = 0
  258. while n >= MIN_MERGE do
  259. r = bit.bor(r, bit.band(n, 1))
  260. n = bit.rshift(n, 1)
  261. end
  262. return n + r
  263. end
  264. local function insertionSortTimSort(arr, left, right)
  265. for i = left + 1, right do
  266. local key = arr[i]
  267. local j = i - 1
  268. while j >= left and arr[j] > key do
  269. arr[j + 1] = arr[j]
  270. j = j - 1
  271. end
  272. arr[j + 1] = key
  273. end
  274. end
  275. local function mergeTimSort(arr, left, mid, right)
  276. local len1 = mid - left + 1
  277. local len2 = right - mid
  278. local leftArr = {}
  279. local rightArr = {}
  280. for i = 1, len1 do
  281. leftArr[i] = arr[left + i - 1]
  282. end
  283. for i = 1, len2 do
  284. rightArr[i] = arr[mid + i]
  285. end
  286. local i = 1
  287. local j = 1
  288. local k = left
  289. while i <= len1 and j <= len2 do
  290. if leftArr[i] <= rightArr[j] then
  291. arr[k] = leftArr[i]
  292. i = i + 1
  293. else
  294. arr[k] = rightArr[j]
  295. j = j + 1
  296. end
  297. k = k + 1
  298. end
  299. while i <= len1 do
  300. arr[k] = leftArr[i]
  301. i = i + 1
  302. k = k + 1
  303. end
  304. while j <= len2 do
  305. arr[k] = rightArr[j]
  306. j = j + 1
  307. k = k + 1
  308. end
  309. end
  310. local function timSort(arr)
  311. local n = #arr
  312. local minRun = calculateMinRun(n)
  313. for i = 1, n, minRun do
  314. insertionSortTimSort(arr, i, math.min(i + minRun - 1, n))
  315. end
  316. local size = minRun
  317. while size < n do
  318. for start = 1, n, size * 2 do
  319. local mid = start + size - 1
  320. local right = math.min(start + size * 2 - 1, n)
  321. if mid < right then
  322. mergeTimSort(arr, start, mid, right)
  323. end
  324. end
  325. size = size * 2
  326. end
  327. end
  328. -- Cubesort algorithm
  329. local function cubeSort(arr)
  330. local n = #arr
  331. -- Find the minimum and maximum values in the array
  332. local minValue = math.min(unpack(arr))
  333. local maxValue = math.max(unpack(arr))
  334. -- Create an array to store the counts of each value
  335. local counts = {}
  336. for i = minValue, maxValue do
  337. counts[i] = 0
  338. end
  339. -- Count the occurrences of each value
  340. for i = 1, n do
  341. counts[arr[i]] = counts[arr[i]] + 1
  342. end
  343. -- Update the array with the sorted values
  344. local index = 1
  345. for i = minValue, maxValue do
  346. while counts[i] > 0 do
  347. arr[index] = i
  348. counts[i] = counts[i] - 1
  349. index = index + 1
  350. end
  351. end
  352. end
  353. -- Exchange Sort algorithm
  354. local function exchangeSort(arr)
  355. local n = #arr
  356. for i = 1, n - 1 do
  357. for j = i + 1, n do
  358. if arr[j] < arr[i] then
  359. swap(arr, i, j)
  360. end
  361. end
  362. end
  363. end
  364. -- Tree Node
  365. local TreeNode = {}
  366. TreeNode.__index = TreeNode
  367. function TreeNode.new(value)
  368. local node = setmetatable({}, TreeNode)
  369. node.value = value
  370. node.left = nil
  371. node.right = nil
  372. return node
  373. end
  374. -- Insert a value into the tree
  375. local function insertNode(root, value)
  376. if root == nil then
  377. return TreeNode.new(value)
  378. end
  379. if value < root.value then
  380. root.left = insertNode(root.left, value)
  381. else
  382. root.right = insertNode(root.right, value)
  383. end
  384. return root
  385. end
  386. -- In-order traversal of the tree
  387. local function inorderTraversal(root, arr, index)
  388. if root ~= nil then
  389. index = inorderTraversal(root.left, arr, index)
  390. arr[index] = root.value
  391. index = index + 1
  392. index = inorderTraversal(root.right, arr, index)
  393. end
  394. return index
  395. end
  396. -- Tree Sort algorithm
  397. local function treeSort(arr)
  398. local n = #arr
  399. local root = nil
  400. -- Construct the binary search tree
  401. for i = 1, n do
  402. root = insertNode(root, arr[i])
  403. end
  404. -- Perform in-order traversal to get sorted array
  405. local index = inorderTraversal(root, arr, 1)
  406. end
  407. -- Cycle Sort algorithm
  408. local function cycleSort(arr)
  409. local n = #arr
  410. for cycleStart = 1, n - 1 do
  411. local item = arr[cycleStart]
  412. local pos = cycleStart
  413. for i = cycleStart + 1, n do
  414. if arr[i] < item then
  415. pos = pos + 1
  416. end
  417. end
  418. if pos == cycleStart then
  419. -- The item is already in its correct position
  420. goto continue
  421. end
  422. while item == arr[pos] do
  423. pos = pos + 1
  424. end
  425. local temp = arr[pos]
  426. arr[pos] = item
  427. item = temp
  428. while pos ~= cycleStart do
  429. pos = cycleStart
  430. for i = cycleStart + 1, n do
  431. if arr[i] < item then
  432. pos = pos + 1
  433. end
  434. end
  435. while item == arr[pos] do
  436. pos = pos + 1
  437. end
  438. temp = arr[pos]
  439. arr[pos] = item
  440. item = temp
  441. end
  442. ::continue::
  443. end
  444. end
  445. -- Helper function to merge two sorted arrays
  446. local function mergeArrays(arr1, arr2)
  447. local merged = {}
  448. local i = 1
  449. local j = 1
  450. while i <= #arr1 and j <= #arr2 do
  451. if arr1[i] <= arr2[j] then
  452. table.insert(merged, arr1[i])
  453. i = i + 1
  454. else
  455. table.insert(merged, arr2[j])
  456. j = j + 1
  457. end
  458. end
  459. while i <= #arr1 do
  460. table.insert(merged, arr1[i])
  461. i = i + 1
  462. end
  463. while j <= #arr2 do
  464. table.insert(merged, arr2[j])
  465. j = j + 1
  466. end
  467. return merged
  468. end
  469. -- Strand Sort algorithm
  470. local function strandSort(arr)
  471. local function recursiveSort(sublist)
  472. if #sublist <= 1 then
  473. return sublist
  474. end
  475. local sorted = { table.remove(sublist, 1) }
  476. local remaining = {}
  477. for i = 1, #sublist do
  478. if sublist[i] >= sorted[#sorted] then
  479. table.insert(sorted, sublist[i])
  480. else
  481. table.insert(remaining, sublist[i])
  482. end
  483. end
  484. return mergeArrays(sorted, recursiveSort(remaining))
  485. end
  486. local sortedArr = recursiveSort(arr)
  487. -- Update the original array
  488. for i = 1, #arr do
  489. arr[i] = sortedArr[i]
  490. end
  491. end
  492. -- Helper function to perform a comparison and swap in the tournament
  493. local function compare(arr, i, j)
  494. if arr[i] > arr[j] then
  495. return i
  496. else
  497. return j
  498. end
  499. end
  500. -- Helper function to perform a recursive tournament
  501. local function tournament(arr, start, end_)
  502. if start == end_ then
  503. return start
  504. else
  505. local mid = math.floor((start + end_) / 2)
  506. local left = tournament(arr, start, mid)
  507. local right = tournament(arr, mid + 1, end_)
  508. return compare(arr, left, right)
  509. end
  510. end
  511. -- Tournament Sort algorithm
  512. local function tournamentSort(arr)
  513. local n = #arr
  514. local sortedArr = {}
  515. local remaining = n
  516. while remaining > 0 do
  517. local winner = tournament(arr, 1, remaining)
  518. sortedArr[remaining] = arr[winner]
  519. arr[winner] = arr[remaining]
  520. remaining = remaining - 1
  521. end
  522. -- Update the original array
  523. for i = 1, n do
  524. arr[i] = sortedArr[i]
  525. end
  526. end
  527. -- Gnome Sort algorithm
  528. local function gnomeSort(arr)
  529. local n = #arr
  530. local i = 2
  531. while i <= n do
  532. if arr[i - 1] <= arr[i] then
  533. i = i + 1
  534. else
  535. swap(arr, i - 1, i)
  536. if i > 2 then
  537. i = i - 1
  538. end
  539. end
  540. end
  541. end
  542. -- Comb Sort algorithm
  543. local function combSort(arr)
  544. local n = #arr
  545. local gap = n
  546. local shrink = 1.3
  547. local sorted = false
  548. while not sorted do
  549. gap = math.floor(gap / shrink)
  550. if gap > 1 then
  551. sorted = false
  552. else
  553. gap = 1
  554. sorted = true
  555. end
  556. local i = 1
  557. while i + gap <= n do
  558. if arr[i] > arr[i + gap] then
  559. swap(arr, i, i + gap)
  560. sorted = false
  561. end
  562. i = i + 1
  563. end
  564. end
  565. end
  566. -- Cocktail Shaker Sort algorithm
  567. local function cocktailShakerSort(arr)
  568. local n = #arr
  569. local start = 1
  570. local finish = n
  571. local swapped = true
  572. while swapped do
  573. swapped = false
  574. -- Perform a forward pass
  575. for i = start, finish - 1 do
  576. if arr[i] > arr[i + 1] then
  577. swap(arr, i, i + 1)
  578. swapped = true
  579. end
  580. end
  581. -- If no swaps occurred, the array is already sorted
  582. if not swapped then
  583. break
  584. end
  585. -- Update the end position for the next pass
  586. finish = finish - 1
  587. -- Perform a backward pass
  588. for i = finish - 1, start - 1, -1 do
  589. if arr[i] > arr[i + 1] then
  590. swap(arr, i, i + 1)
  591. swapped = true
  592. end
  593. end
  594. -- Update the start position for the next pass
  595. start = start + 1
  596. end
  597. end
  598. -- Pigeonhole Sort algorithm
  599. local function pigeonholeSort(arr)
  600. local n = #arr
  601. local minVal = math.min(unpack(arr))
  602. local maxVal = math.max(unpack(arr))
  603. local range = maxVal - minVal + 1
  604. local pigeonholes = {}
  605. -- Initialize pigeonholes
  606. for i = 1, range do
  607. pigeonholes[i] = {}
  608. end
  609. -- Distribute elements into pigeonholes
  610. for i = 1, n do
  611. local value = arr[i]
  612. local index = value - minVal + 1
  613. table.insert(pigeonholes[index], value)
  614. end
  615. -- Gather sorted elements from pigeonholes
  616. local sortedIndex = 1
  617. for i = 1, range do
  618. local hole = pigeonholes[i]
  619. for j = 1, #hole do
  620. arr[sortedIndex] = hole[j]
  621. sortedIndex = sortedIndex + 1
  622. end
  623. end
  624. end
  625. -- Bucket Sort algorithm (uniform keys)
  626. local function bucketSortUniform(arr)
  627. local n = #arr
  628. local numBuckets = n -- Number of buckets equals the number of elements
  629. -- Create empty buckets
  630. local buckets = {}
  631. for i = 1, numBuckets do
  632. buckets[i] = {}
  633. end
  634. -- Distribute elements into buckets
  635. for i = 1, n do
  636. local index = math.floor(arr[i] * numBuckets) + 1
  637. table.insert(buckets[index], arr[i])
  638. end
  639. -- Sort individual buckets
  640. for i = 1, numBuckets do
  641. table.sort(buckets[i])
  642. end
  643. -- Concatenate sorted buckets
  644. local index = 1
  645. for i = 1, numBuckets do
  646. for j = 1, #buckets[i] do
  647. arr[index] = buckets[i][j]
  648. index = index + 1
  649. end
  650. end
  651. end
  652. -- Bucket Sort algorithm (integer keys)
  653. local function bucketSortInteger(arr)
  654. local n = #arr
  655. local maxVal = math.max(unpack(arr))
  656. local numBuckets = maxVal + 1
  657. -- Create empty buckets
  658. local buckets = {}
  659. for i = 1, numBuckets do
  660. buckets[i] = {}
  661. end
  662. -- Distribute elements into buckets
  663. for i = 1, n do
  664. local index = arr[i] + 1
  665. table.insert(buckets[index], arr[i])
  666. end
  667. -- Sort individual buckets (if needed)
  668. for i = 1, numBuckets do
  669. if #buckets[i] > 1 then
  670. table.sort(buckets[i])
  671. end
  672. end
  673. -- Concatenate sorted buckets
  674. local index = 1
  675. for i = 1, numBuckets do
  676. for j = 1, #buckets[i] do
  677. arr[index] = buckets[i][j]
  678. index = index + 1
  679. end
  680. end
  681. end
  682. -- Spreadsort algorithm
  683. local function spreadSort(arr)
  684. local n = #arr
  685. local numKeys = n -- Number of keys equals the number of elements
  686. -- Create auxiliary arrays
  687. local indexes = {}
  688. local counts = {}
  689. -- Initialize indexes and counts arrays
  690. for i = 1, numKeys do
  691. indexes[i] = i
  692. counts[i] = 0
  693. end
  694. -- Count the occurrences of each key
  695. for i = 1, n do
  696. local key = arr[i]
  697. counts[key] = counts[key] + 1
  698. end
  699. -- Calculate the starting index for each key
  700. local sum = 0
  701. for i = 1, numKeys do
  702. local count = counts[i]
  703. counts[i] = sum
  704. sum = sum + count
  705. end
  706. -- Permute the elements based on their keys
  707. local sortedArr = {}
  708. for i = 1, n do
  709. local key = arr[i]
  710. local index = counts[key] + indexes[key]
  711. sortedArr[index] = arr[i]
  712. indexes[key] = indexes[key] + 1
  713. end
  714. -- Copy the sorted elements back to the original array
  715. for i = 1, n do
  716. arr[i] = sortedArr[i]
  717. end
  718. end
  719. -- Burstsort algorithm
  720. local function burstSort(arr)
  721. local n = #arr
  722. local blockSize = math.floor(math.sqrt(n)) -- Size of each block
  723. -- Create blocks
  724. local blocks = {}
  725. local numBlocks = math.ceil(n / blockSize)
  726. for i = 1, numBlocks do
  727. local block = {}
  728. local start = (i - 1) * blockSize + 1
  729. local stop = math.min(start + blockSize - 1, n)
  730. for j = start, stop do
  731. table.insert(block, arr[j])
  732. end
  733. table.sort(block)
  734. table.insert(blocks, block)
  735. end
  736. -- Merge the sorted blocks into the original array
  737. local index = 1
  738. while #blocks > 0 do
  739. local minBlockIndex = 1
  740. for i = 2, #blocks do
  741. if blocks[i][1] < blocks[minBlockIndex][1] then
  742. minBlockIndex = i
  743. end
  744. end
  745. local minBlock = blocks[minBlockIndex]
  746. arr[index] = minBlock[1]
  747. table.remove(minBlock, 1)
  748. index = index + 1
  749. if #minBlock == 0 then
  750. table.remove(blocks, minBlockIndex)
  751. end
  752. end
  753. end
  754. -- Flashsort algorithm
  755. local function flashSort(arr)
  756. local n = #arr
  757. local minVal = arr[1]
  758. local maxVal = arr[1]
  759. -- Find the minimum and maximum values
  760. for i = 2, n do
  761. if arr[i] < minVal then
  762. minVal = arr[i]
  763. elseif arr[i] > maxVal then
  764. maxVal = arr[i]
  765. end
  766. end
  767. -- Calculate the number of classes and the class width
  768. local numClasses = math.floor(0.45 * n)
  769. local classWidth = (maxVal - minVal) / numClasses
  770. -- Count the number of elements in each class
  771. local counts = {}
  772. for i = 1, numClasses do
  773. counts[i] = 0
  774. end
  775. for i = 1, n do
  776. local classIndex = math.floor((arr[i] - minVal) / classWidth) + 1
  777. counts[classIndex] = counts[classIndex] + 1
  778. end
  779. -- Calculate the starting position of each class
  780. local sum = 0
  781. for i = 1, numClasses do
  782. local count = counts[i]
  783. counts[i] = sum
  784. sum = sum + count
  785. end
  786. -- Permute the elements based on their classes
  787. while counts[1] < n do
  788. local currentIndex = counts[1] + 1
  789. local currentElement = arr[currentIndex]
  790. local classIndex = math.floor((currentElement - minVal) / classWidth) + 1
  791. if classIndex ~= 1 then
  792. local swapIndex = counts[classIndex]
  793. swap(arr, currentIndex, swapIndex)
  794. else
  795. currentIndex = currentIndex + 1
  796. end
  797. counts[classIndex] = counts[classIndex] + 1
  798. end
  799. -- Insertion sort on each class
  800. for i = 2, numClasses do
  801. local start = counts[i - 1] + 1
  802. local stop = counts[i]
  803. for j = start + 1, stop do
  804. local key = arr[j]
  805. local k = j - 1
  806. while k >= start and arr[k] > key do
  807. arr[k + 1] = arr[k]
  808. k = k - 1
  809. end
  810. arr[k + 1] = key
  811. end
  812. end
  813. end
  814. return {
  815. bubbleSort = bubbleSort,
  816. insertionSort = insertionSort,
  817. selectionSort = selectionSort,
  818. mergeSort = mergeSort,
  819. quickSort = quickSort,
  820. shellSort = shellSort,
  821. countingSort = countingSort,
  822. heapSort = heapSort,
  823. radixSort = radixSort,
  824. introSort = introSort,
  825. blockSort = blockSort,
  826. timSort = timSort,
  827. cubeSort = cubeSort,
  828. exchangeSort = exchangeSort,
  829. treeSort = treeSort,
  830. cycleSort = cycleSort,
  831. strandSort = strandSort,
  832. tournamentSort = tournamentSort,
  833. gnomeSort = gnomeSort,
  834. combSort = combSort,
  835. cocktailShakerSort = cocktailShakerSort,
  836. pigeonholeSort = pigeonholeSort,
  837. bucketSortUniform = bucketSortUniform,
  838. bucketSortInteger = bucketSortInteger,
  839. spreadSort = spreadSort,
  840. burstSort = burstSort,
  841. flashSort = flashSort
  842. }