Big O Как отслеживать итерации в алгоритме быстрой сортировки? C

#c #algorithm #big-o #quicksort #trace

#c #алгоритм #big-o #быстрая сортировка #трассировка

Вопрос:

У меня есть следующий алгоритм быстрой сортировки кода на C.

 #include <stdio.h>
#include <stdbool.h>

int list[] = {8, 1, 3, 4, 2, 10, 4, 6};
//int list[] = {2, 1, 10, 4, 5, 11, 12, 6};
//int list[] = {35, 33, 42, 10, 14, 19, 27, 44, 26, 31};
int main(int argc, char **argv)
{

    printf("Unsorted list is: ");
    printArray(list);
    quickSort(0, 7);
    printf("Sorted list is: ");
    printArray(list);

    return 0;
}

int partition(int left, int right, int pivot){

    int leftPointer = left -1;
    int rightPointer = right;
    while(true){

        while(list[  leftPointer] < pivot){
         //do nothing
//       printf("proses index kiri %dn", leftPointer);

        }

        while(rightPointer > 0 amp;amp; list[--rightPointer] > pivot){
         //do nothing
//       printf("proses index kanan %dn", rightPointer);
        }

        if(leftPointer >= rightPointer){
            break;
        }else{
            printf("item swapped :%d,%dn", 
            list[leftPointer],list[rightPointer]);

            swap(leftPointer, rightPointer);
//          return;
//          left  ;
//          right--;
        }

    }
    printf("pivot swapped :%d,%dn", list[leftPointer],list[right]);
    swap(leftPointer, right);
    printf("pivot index %dn", leftPointer);
    return leftPointer;

}

void quickSort(int left, int right){
    if(right - left <= 0){
        return;
    }else{
        int pivot = list[right];
        int pIndex = partition(left, right, pivot);
        quickSort(left, pIndex-1);
        quickSort(pIndex 1, right);
//      printf("aman lanjut proses");
    }
}

void printArray(int list[]){
    int i;
    for(i = 0; i < 8; i  ){
        printf(" %d ", list[i]);
    }   
    printf("nn");
}

void swap(int left, int right){
    //variabel sementara untuk menampung i
    int temporary = list[left];

    //tukar posisi, sehingga yg kecil di kiri, yg besar di kanan.
    list[left] = list[right];
    list[right] = temporary;
}
  

Где я должен поместить «printf», чтобы указать шаг итерации (трассировки)?

Потому что цель в том, что я хочу проверить / посчитать текущие данные, насколько сложна нотация Big O? найдите наилучший, средний или наихудший случай.

Ответ №1:

Big O говорит, что каждая «операция» имеет одинаковую стоимость. Даже это так же тривиально, как увеличение указателя. Итак, вам нужно настроить глобальный счетчик, а затем увеличивать его с каждым внутренним циклом. Итак, два цикла while leftpointer и while rightpointer, плюс цикл while true . Одно приращение для каждого прохода.