You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

134 regels
3.3 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. void reserve(unsigned int count) {
  45. if (next_index+count <= length) {
  46. length *= 2;
  47. data = (type*)realloc(data, length * sizeof(type));
  48. }
  49. }
  50. type& operator[](int index) {
  51. return data[index];
  52. }
  53. void _merge(int start, int mid, int end) {
  54. int start2 = mid + 1;
  55. /* If the direct merge is already sorted */
  56. if ((size_t)data[mid] <= (size_t)data[start2]) {
  57. return;
  58. }
  59. /* Two pointers to maintain start of both arrays to merge */
  60. while (start <= mid && start2 <= end) {
  61. if ((size_t)data[start] <= (size_t)data[start2]) {
  62. start++;
  63. }
  64. else {
  65. type value = data[start2];
  66. int index = start2;
  67. /* Shift all the elements between element 1; element 2, right by 1. */
  68. while (index != start) {
  69. data[index] = data[index - 1];
  70. index--;
  71. }
  72. data[start] = value;
  73. /* Update all the pointers */
  74. start++;
  75. mid++;
  76. start2++;
  77. }
  78. }
  79. }
  80. void sort(int left=-1, int right=-1) {
  81. if (left == -1) {
  82. if (next_index == 0)
  83. return;
  84. sort(0, next_index - 1);
  85. return;
  86. } else if (left == right) {
  87. return;
  88. }
  89. int middle = left + (right-left) / 2;
  90. sort(left, middle);
  91. sort(middle+1, right);
  92. _merge(left, middle, right);
  93. }
  94. int sorted_find(type elem, int left=-1, int right=-1) {
  95. if (left == -1) {
  96. return sorted_find(elem, 0, next_index - 1);
  97. } else if (left == right) {
  98. if ((size_t)data[left] == (size_t)elem)
  99. return left;
  100. return -1;
  101. } else if (right < left)
  102. return -1;
  103. int middle = left + (right-left) / 2;
  104. if ((size_t)data[middle] < (size_t)elem)
  105. return sorted_find(elem, middle+1, right);
  106. if ((size_t)data[middle] > (size_t)elem)
  107. return sorted_find(elem, left, middle-1);
  108. return middle;
  109. }
  110. };