Прямые методы сортировки

void Bubblesort(int a[],int n)  {  
    std::chrono::high_resolution_clock::time_point t5 = std::chrono::high_resolution_clock::now(); 
    int tmp,i, L = 0, R = n - 1, pos = 0, assings=0, cmp=0; 
     
    while(L<R)  {  
        i = L; 
        pos = -1; 
        for (int j = i+1; j < n; ++j)  {  
            if (a[i] > a[j])  {  
                tmp = a[i]; 
                a[i] = a[j]; 
                a[j] = tmp; 
                pos = i; 
                ++assings; 
             }  
            ++i; 
            ++cmp; 
         }  
        if (pos == -1)  {  
            break; 
         }  
        R = pos; 
        i = R; 
    } 

void DirectInclusion(int a[], int n)  {  
    std::chrono::high_resolution_clock::time_point t1 = std::chrono::high_resolution_clock::now(); 
    int j,x, assings=0, cmp=0; 
    for (int i = 1; i < n ; ++i)  {  
        x = a[i]; 
        j = i - 1; 
        ++assings; 
        while (x < a[j] && j >= 0)  {  
            a[j + 1] = a[j]; 
            j = j - 1; 
            ++assings; 
         }  
        a[j + 1] = x; 
        ++assings; 
     }  
    std::chrono::high_resolution_clock::time_point t2 = std::chrono::high_resolution_clock::now(); 
    std::chrono::duration<double> seconds = std::chrono::duration_cast<std::chrono::duration<double>>(t2 - t1); 
    printf("Время работы: %.10f seconds", seconds.count()); 
    cout << endl; 
    cout << "Количество сравнений: " << cmp << "\nКоличество присваиваний: " << assings << endl; 
 } 

void SelectionSort(int a[],int n)  {  
    std::chrono::high_resolution_clock::time_point t1 = std::chrono::high_resolution_clock::now(); 
    int min,minNum=0,L=0,R=n-1,assings=0,cmp=0; 
    for (int i = 0; i < n - 1; ++i)  {  
 
        min = INT_MAX; 
 
        for (int j = i; j < n; ++j)  {  
            if (a[j] < min)  {   
                min = a[j]; 
                minNum = j; 
             }  
            ++cmp; 
         }  
        a[minNum] = a[i]; 
        a[i] = min; 
        ++assings; 
     }  
    cout << "Количество сравнений: " << cmp << "\nКоличество присваиваний: " << assings<<endl; 
    std::chrono::high_resolution_clock::time_point t2 = std::chrono::high_resolution_clock::now(); 
    std::chrono::duration<double> seconds = std::chrono::duration_cast<std::chrono::duration<double>>(t2 - t1); 
    printf("Время работы: %.10f seconds", seconds.count()); 
    cout << endl; 
 
 } 

Сделал 3 метода сортировки

  1. Сортировка прямым обменом (пузырек)
  2. Сортировка прямым выбором
  3. Сортировка прямым включением

Пытаюсь разбить массив на 2 части: отсортированную и неотсортированную. С пузырьком проблем не было, а с остальными 2 не получается. Мне надо аналогично это сделать для прямого выбора и включения


Ответы (1 шт):

Автор решения: MBo

После внешнего цикла сортировки вставками со счётчиком i часть массива 0..i-1 является отсортированной, но не совпадает (обычно) с той же частью в финальном (после окончания сортировки) массиве.

После внешнего цикла сортировки выбором со счётчиком i часть массива 0..i отсортирована, и совпадает с той же частью в финальном массиве.

→ Ссылка