Где сравнения в методах сортировки Java? - PullRequest
0 голосов
/ 28 ноября 2011

Вопрос: Где проводится сравнение в каждом отдельном методе сортировки?
Также, если вы знаете, скажите, пожалуйста, какие числа методов неверны и где вместо них разместить мои счетчики. Пытайтесь понять, где и сколько раз методы сортировки сравнивают.

Method        A        B   
Selection    4950     4950 
Bubble        99      9900 
Insertion     99      5049
Merge         712     1028
Shell         413      649
Quick        543      1041

Хорошо, чтобы объяснить некоторые части, в основном, массив A - это массив от 1 до 100 в порядке возрастания. Так что это должно быть минимальное количество сравнений.
Массив B равен 100-1 в порядке убывания. Поэтому я считаю, что это должно быть максимальное количество сравнений. Массив C это просто случайно сгенерированные числа, поэтому он меняется каждый раз.

Я чувствую, что мой выбор и пузырьковые виды были учтены правильно. Не стесняйтесь сообщить мне, где производятся сравнения, которые я не учел, или если я считаю неправильные сравнения.

Примечание: добавлена ​​глобальная переменная для подсчета методов, которые были рекурсивными в нескольких разделах.

class Sorting
   {
      static int[] X = new int[100];
      static int mergecount = 0;
      static int quickcount = 0;
      public static void selectionSort(int list[])
      {
         int count = 0;
         int position = 0, n = list.length;
         for(int j = 0; j < n-1; j++)
         {
            position = j;
            for(int k = j+1; k < n; k++)
            {
               count++;
               if(list[k] < list[position])
                  position = k;
            }
            Swap(list, j, position);
         }
         System.out.println("counter" + count);
      }

  public static void Swap(int list[], int j, int k)
  {
     int temp = list[j];
     list[j] = list[k];
     list[k] = temp;
  }

  public static void bubbleSort(int list[])
  {
     int count = 0;
     boolean changed = false;
     do
     {
        changed = false;
        for(int j = 0; j < list.length - 1; j++)
        {
           count++;
           if(list[j] > list[j + 1])
           {
              Swap(list, j, j+1);
              changed = true;
           }
        }
     } while(changed);
     System.out.println("counter" + count);
  }

  public static void insertionSort(int list[])
  {
     int count = 0;
     for(int p = 1; p < list.length; p++)
     {
        int temp = list[p];
        int j = p;
        count++;
        for( ; j > 0 && temp < list[j - 1]; j = j-1)
        {
           list[j] = list[j - 1];
           count++;
        }
        list[j] = temp;
     }
     System.out.println("counter" + count);
  }

  public static void mergeSort(int list[])
  {
     mergeSort(list, 0, list.length - 1);
     System.out.println("counter" + mergecount);
  }

  public static void mergeSort(int list[], int first, int last)
  {
     if(first < last)
     {
        int mid = (first + last) / 2;
        mergeSort(list, first, mid);
        mergeSort(list, mid + 1, last);
        Merge(list, first, mid, last);
     }

  }

  public static void Merge(int list[], int first, int mid, int last)
  {
     int count = 0;
     int first1 = first, last1 = mid;
     int first2 = mid + 1, last2 = last;
     int temp[] = new int[list.length];
     int index = first1;

     while(first1 <= last1 && first2 <= last2)
     {
        if(list[first1] < list[first2])
        {
           temp[index] = list[first1++];
           mergecount++;
        }
        else
           temp[index] = list[first2++];
        index++;
        mergecount++;
     }

     while(first1 <= last1)
        temp[index++] = list[first1++];

     while(first2 <= last2)
        temp[index++] = list[first2++];

     for(index = first; index <= last; index++)
        list[index] = temp[index];


  }

  public static void shellSort(int list[])
  {
     int count = 0;
     int n = list.length;
     for(int gap = n / 2; gap > 0; gap = gap == 2 ? 1: (int) (gap/2.2))
        for(int i = gap; i < n; i++)
        {
           int temp = list[i];
           int j = i;
           count++;
           for( ; j >= gap && (temp < (list[j - gap])); j -= gap)
           {
              list[j] = list[j - gap];
              count++;
           }

           list[j] = temp;
        }
     System.out.println("counter" + count);
  }

  public static void quickSort(int start, int finish, int list[])
  {
     int count = 0;
     int left = start, right = finish, pivot, temp;
     pivot = list[(start + finish) / 2];
     do
     {
        while(list[left] < pivot)
        {
           left++;
           quickcount++;
        }

        while(pivot < list[right])
        {
           right--;
           quickcount++;
        }

        if(left <= right)
        {
           temp = list[left];
           list[left++] = list[right];
           list[right--] = temp;
           quickcount++;
        }
     }  while(left < right);

     if(start < right)
        quickSort(start, right, list);


     if(left < finish)
        quickSort(left, finish, list);

  }

  public static void copy(int list[])
  {
     for(int i = 0; i < list.length; i++)
        X[i] = list[i];
  }

  public static void restore(int list[])
  {
     for(int i = 0; i < list.length; i++)
        list[i] = X[i];
  }

  public static void displayArray(int list[])
  {
     for(int k = 0; k < list.length; k++)
        System.out.print(list[k] + " ");
     System.out.println();
  }

  public static void main(String args[])
  {
     int[] A = new int[100];
     for(int i = 0; i < A.length; i++)
        A[i] = i + 1;

     int[] B = new int[100];
     int q = 100;
     for(int i = 0; i < B.length; i++)
        B[i] = q--;

     int[] C = new int[100];
     for(int i = 0; i < C.length; i++)
        C[i] = (int)(Math.random() * 100 + 1); 

     displayArray(A);
     copy(A);
     selectionSort(A);
     displayArray(A);
     restore(A);
}

1 Ответ

1 голос
/ 28 ноября 2011

Обратите внимание, что на производительность QuickSort сильно влияет выбор точки поворота.Когда оба ваших тестовых массива отсортированы (по возрастанию / по убыванию), а также потому, что вы выбираете пивот как массив [длина / 2], вы фактически всегда выбираете лучший пивот.Таким образом, ваш контрольный пример B не будет генерировать максимальное количество сравнений для быстрой сортировки.Если вы подбирали массив [0] в качестве оси вы получите максимальное количество сравнений для тестового случая A и B.

1002 * Самый простой способ подсчета сравнения является использование функции сравнения и сделать его там.
static int compareCount = 0;
int compareInt(int a, int b) {
    compareCount++;
    return a - b; // if 0 they are equal, if negative a is smaller, if positive b is smaller
}

Теперь просто используйте CompareInt во всех ваших алгоритмах, и вы получите точный счет.Вам придется сбрасывать CompareCount между каждым запуском.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...