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.
 
 
 
 

105 righe
2.6 KiB

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