Advertisement
minh_tran_782

sort

Aug 12th, 2022 (edited)
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.72 KB | None | 0 0
  1. static void merge(T* left, T* mid, T* right){
  2.     int n1 = mid - left + 1;
  3.     int n2 = right - mid;
  4.     T* lhs = new T[n1];
  5.     T* rhs = new T[n2];
  6.     for (int i = 0; i < n1; ++i){
  7.         lhs[i] = *(left + i);
  8.     }
  9.     for (int j = 0; j < n2; ++j){
  10.         rhs[j] = *(mid + 1 + j);
  11.     }
  12.     int i,j;
  13.     i = 0;
  14.     j = 0;
  15.     T* k = left;
  16.     while (i < n1 && j < n2){
  17.         if (lhs[i] <= rhs[j]){
  18.             *k = lhs[i];
  19.             ++i;
  20.         }
  21.         else {
  22.             *k = rhs[j];
  23.             ++j;
  24.         }
  25.         k = k + 1;
  26.     }
  27.    
  28.     while (i < n1){
  29.         *k = lhs[i];
  30.         ++i;
  31.         ++k;
  32.     }
  33.     while (j < n2){
  34.         *k = rhs[j];
  35.         ++j;
  36.         ++k;
  37.     }
  38.     Sorting::printArray(left,right);
  39. }
  40.  
  41. static void mergeSort(T* start, T* end){
  42.     if (start < end){
  43.         T* mid = start + (end - start)/2;
  44.         mergeSort(start,mid);
  45.         mergeSort(mid+1,end);
  46.         merge(start,mid,end);
  47.     }
  48.     return;
  49.    
  50. }
  51.  
  52. static void sortSegment(T* start, T* end, int segment_idx, int cur_segment_total) {
  53.     int current = segment_idx + cur_segment_total;
  54.     int walker = 0;
  55.     while (current < (end-start)){
  56.         T temp = start[current];
  57.         walker = current - cur_segment_total;
  58.         while (walker >= 0 && temp < start[walker]){
  59.             start[walker + cur_segment_total] = start[walker];
  60.             walker = walker - cur_segment_total;
  61.         }
  62.         start[walker + cur_segment_total] = temp;
  63.         current = current + cur_segment_total;
  64.     }
  65.     return;
  66. }
  67.  
  68. static void ShellSort(T* start, T* end, int* num_segment_list, int num_phases) {
  69.     // TODO
  70.     // Note: You must print out the array after sorting segments to check whether your algorithm is true.
  71.     int segment = 1;
  72.     int* k = (num_segment_list + num_phases - 1);
  73.     while (num_phases > 0){
  74.         segment = 1;
  75.         while (segment <= *k){
  76.             sortSegment(start,end,*k,segment);
  77.             ++segment;
  78.         }
  79.         cout << *k << " segments: "; printArray(start,end);
  80.         --num_phases;
  81.         k = num_segment_list + num_phases - 1;
  82.     }
  83. }
  84. template <class T>
  85. void SLinkedList<T>::bubbleSort()
  86. {
  87.     if (this->count == 1) return;
  88.     Node* list = this->head;
  89.   //  bool flag = false;
  90.    for (int i = 1; i < this->count; ++i){
  91.    //    flag = false;
  92.        while (list->next != NULL){
  93.            if (list->data > list->next->data){
  94.           //     flag = true;
  95.                T temp = list->data;
  96.                list->data = list->next->data;
  97.                list->next->data = temp;
  98.            }
  99.            list = list->next;
  100.        }
  101.        this->printList();
  102.        list = this->head;
  103.    }
  104.  
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement