Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 

115 lignes
2.8 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. if (data) {
  15. free(data);
  16. data = nullptr;
  17. }
  18. }
  19. type* begin() {
  20. return data;
  21. }
  22. type* end() {
  23. return data+(next_index);
  24. }
  25. void remove_index(int index) {
  26. data[index] = data[--next_index];
  27. }
  28. void append(type element) {
  29. if (next_index == length) {
  30. length *= 2;
  31. data = (type*)realloc(data, length * sizeof(type));
  32. }
  33. data[next_index] = element;
  34. next_index++;
  35. }
  36. type& operator[](int index) {
  37. return data[index];
  38. }
  39. void _merge(int start, int mid, int end) {
  40. int start2 = mid + 1;
  41. /* If the direct merge is already sorted */
  42. if ((size_t)data[mid] <= (size_t)data[start2]) {
  43. return;
  44. }
  45. /* Two pointers to maintain start of both arrays to merge */
  46. while (start <= mid && start2 <= end) {
  47. if ((size_t)data[start] <= (size_t)data[start2]) {
  48. start++;
  49. }
  50. else {
  51. type value = data[start2];
  52. int index = start2;
  53. /* Shift all the elements between element 1; element 2, right by 1. */
  54. while (index != start) {
  55. data[index] = data[index - 1];
  56. index--;
  57. }
  58. data[start] = value;
  59. /* Update all the pointers */
  60. start++;
  61. mid++;
  62. start2++;
  63. }
  64. }
  65. }
  66. void sort(int left=-1, int right=-1) {
  67. if (left == -1) {
  68. sort(0, next_index - 1);
  69. return;
  70. } else if (left == right) {
  71. return;
  72. }
  73. int middle = left + (right-left) / 2;
  74. sort(left, middle);
  75. sort(middle+1, right);
  76. _merge(left, middle, right);
  77. }
  78. int sorted_find(type elem, int left=-1, int right=-1) {
  79. if (left == -1) {
  80. return sorted_find(elem, 0, next_index - 1);
  81. } else if (left == right) {
  82. if ((size_t)data[left] == (size_t)elem)
  83. return left;
  84. return -1;
  85. } else if (right < left)
  86. return -1;
  87. int middle = left + (right-left) / 2;
  88. if ((size_t)data[middle] < (size_t)elem)
  89. return sorted_find(elem, middle+1, right);
  90. if ((size_t)data[middle] > (size_t)elem)
  91. return sorted_find(elem, left, middle-1);
  92. return middle;
  93. }
  94. };