Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 
 

127 righe
3.1 KiB

  1. #pragma once
  2. #include <stdlib.h>
  3. template <typename type>
  4. struct Array_List {
  5. type* data;
  6. int length;
  7. int next_index;
  8. Array_List(int initial_capacity = 16) {
  9. data = (type*)malloc(initial_capacity * sizeof(type));
  10. next_index = 0;
  11. length = initial_capacity;
  12. }
  13. ~Array_List() {
  14. free(data);
  15. data = 0;
  16. }
  17. Array_List<type> clone() {
  18. Array_List<type> ret;
  19. ret.length = length;
  20. ret.next_index = next_index;
  21. ret.data = (type*)malloc(length * sizeof(type));
  22. for (int i = 0; i < next_index; ++i) {
  23. ret.data[i] = data[i];
  24. }
  25. return ret;
  26. }
  27. type* begin() {
  28. return data;
  29. }
  30. type* end() {
  31. return data+(next_index);
  32. }
  33. void remove_index(int index) {
  34. data[index] = data[--next_index];
  35. }
  36. void append(type element) {
  37. if (next_index == length) {
  38. length *= 2;
  39. data = (type*)realloc(data, length * sizeof(type));
  40. }
  41. data[next_index] = element;
  42. next_index++;
  43. }
  44. type& operator[](int index) {
  45. return data[index];
  46. }
  47. void _merge(int start, int mid, int end) {
  48. int start2 = mid + 1;
  49. /* If the direct merge is already sorted */
  50. if ((size_t)data[mid] <= (size_t)data[start2]) {
  51. return;
  52. }
  53. /* Two pointers to maintain start of both arrays to merge */
  54. while (start <= mid && start2 <= end) {
  55. if ((size_t)data[start] <= (size_t)data[start2]) {
  56. start++;
  57. }
  58. else {
  59. type value = data[start2];
  60. int index = start2;
  61. /* Shift all the elements between element 1; element 2, right by 1. */
  62. while (index != start) {
  63. data[index] = data[index - 1];
  64. index--;
  65. }
  66. data[start] = value;
  67. /* Update all the pointers */
  68. start++;
  69. mid++;
  70. start2++;
  71. }
  72. }
  73. }
  74. void sort(int left=-1, int right=-1) {
  75. if (left == -1) {
  76. if (next_index == 0)
  77. return;
  78. sort(0, next_index - 1);
  79. return;
  80. } else if (left == right) {
  81. return;
  82. }
  83. int middle = left + (right-left) / 2;
  84. sort(left, middle);
  85. sort(middle+1, right);
  86. _merge(left, middle, right);
  87. }
  88. int sorted_find(type elem, int left=-1, int right=-1) {
  89. if (left == -1) {
  90. return sorted_find(elem, 0, next_index - 1);
  91. } else if (left == right) {
  92. if ((size_t)data[left] == (size_t)elem)
  93. return left;
  94. return -1;
  95. } else if (right < left)
  96. return -1;
  97. int middle = left + (right-left) / 2;
  98. if ((size_t)data[middle] < (size_t)elem)
  99. return sorted_find(elem, middle+1, right);
  100. if ((size_t)data[middle] > (size_t)elem)
  101. return sorted_find(elem, left, middle-1);
  102. return middle;
  103. }
  104. };