Exemplo n.º 1
0
        static private int PartitionQSHo(ref T[] arr, int p, int r, SelectPivot sp)
        {
            Swap(ref arr[sp(p, r, ref arr)], ref arr[p]);
            T   x = arr[p];
            int i = p;
            int j = r;

            while (true)
            {
                for (; j >= p + 1; j--)
                {
                    if (arr[j].CompareTo(x) < 0)
                    {
                        break;
                    }
                }
                for (; i <= r - 1; i++)
                {
                    if (arr[i].CompareTo(x) > 0)
                    {
                        break;
                    }
                }
                if (i < j)
                {
                    Swap(ref arr[i], ref arr[j]);
                }
                else
                {
                    Swap(ref arr[p], ref arr[j]);
                    return(j);
                }
            }
        }
Exemplo n.º 2
0
        static private int PartitionQS(ref T[] arr, int left, int right, SelectPivot sp)
        {
            Swap(ref arr[sp(left, right, ref arr)], ref arr[right]);
            T   x = arr[right];
            int i = left;//i는 x가 들어가야할 자리.

            for (int j = left; j < right; j++)
            {
                if (arr[j].CompareTo(x) < 0)//j번째가 x보다 우선순위가 낮다면
                {
                    Swap(ref arr[i], ref arr[j]);
                    //만약 먼저 검사했던 모든 원소들이 x보다 작거나 x와 같았다면, swap은 일어나지 않는다.
                    //가장 최근에 검사한 x보다 큰 원소의 index를 k라 하자.
                    //k는 x보다 큰데 x의 자리인 i보다 더 왼쪽에 있으므로,
                    //x보다 작은 원소인 j번째 원소와 교환시켜야 제자리를 찾게 되는 것이다.
                    i++;//j번째가 x보다 앞에 들어가야 하므로, i를 증가시킨다.
                }
            }
            Swap(ref arr[i], ref arr[right]);
            return(i);
        }
Exemplo n.º 3
0
        static private void QuickSort(ref T[] arr, int left, int right, SelectPivot sp)
        {
            if (left < right)
            {
                int q = PartitionQSHo(ref arr, left, right, sp);
                QuickSort(ref arr, left, q - 1, sp);
                QuickSort(ref arr, q + 1, right, sp);
            }
            //밑 : 본래의 것보다 좀 지저분해지긴 했지만 쨌든 윤성우식.

            /*
             * if (left >= right) return;
             * //Partition
             * int pivot = sp.Invoke(left,right, ref arr);
             * int low = (pivot == left) ? left+1 : left;
             * int high = (pivot == right) ? right - 1 : right;
             * while (true)
             * {
             *  for (;low<=right;low++)
             *  {
             *      if (arr[low].CompareTo(arr[pivot]) > 0) break;
             *  }
             *  for (;high>=left;high--)
             *  {
             *      if (arr[high].CompareTo(arr[pivot]) < 0) break;
             *  }
             *  if (low > right) { Swap(ref arr[pivot], ref arr[right]); QuickSort(ref arr, left, right - 1, sp); return;}
             *  if (high < left) { Swap(ref arr[pivot], ref arr[left]); QuickSort(ref arr, left+1, right, sp); return; }
             *  if (low <= high) Swap(ref arr[low], ref arr[high]); else break;
             * }
             * Swap(ref arr[pivot], ref arr[high]);
             *
             * pivot = high;
             * //Partition
             *
             * QuickSort(ref arr, left, pivot - 1, sp);
             * QuickSort(ref arr, pivot+1, right, sp);
             * //... 좀 지저분하게 구현해버렸다?
             */
        }
Exemplo n.º 4
0
 static public void QuickSort(ref T[] arr, int len, SelectPivot sp)
 {
     QuickSort(ref arr, 0, len - 1, sp);
 }