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); } } }
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); }
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); * //... 좀 지저분하게 구현해버렸다? */ }
static public void QuickSort(ref T[] arr, int len, SelectPivot sp) { QuickSort(ref arr, 0, len - 1, sp); }