using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Sort { class QSort { static public void Sort1(int[] arr, int beg, int end) { if (end - beg < 1) return; if(end == beg+1) { if (arr[beg] > arr[end]) lib.Swap<int>(arr, beg, end); return; } int current = beg+1; int midVal = arr[beg]; for(int i = beg+1; i<=end; i++) { if(arr[i] < midVal) { lib.Swap<int>(arr, i, current); current++; } } lib.Swap<int>(arr, beg, current-1); Sort1(arr, beg, current - 2); Sort1(arr, current, end); } static public void Sort2(int[] arr, int beg, int end) { if (end - beg < 1) return; if (end == beg + 1) { if (arr[beg] > arr[end]) lib.Swap<int>(arr, beg, end); return; } int midVal = arr[beg]; int minIdx = beg+1; int maxIdx = end; while(minIdx < maxIdx) { while (minIdx < maxIdx && arr[minIdx] < midVal) minIdx++; while (minIdx < maxIdx && arr[maxIdx] >= midVal) maxIdx--; if (minIdx != maxIdx) lib.Swap<int>(arr, minIdx, maxIdx); } if (arr[minIdx] >= midVal) { lib.Swap<int>(arr, minIdx - 1, beg); Sort2(arr, beg, minIdx - 2); Sort2(arr, minIdx, end); } else { lib.Swap<int>(arr, minIdx, beg); Sort2(arr, beg, minIdx - 1); Sort2(arr, minIdx+1, end); } } static public void Sort3(int[] arr, int beg, int end) { if (beg >= end) return; if (end == beg + 1) { if (arr[beg] > arr[end]) lib.Swap<int>(arr, beg, end); return; } int first = beg; int last = end; int key = arr[beg]; while (last > first) { if (arr[last] > key) { last--; continue; } if (arr[first] <= key) { first++; continue; } lib.Swap(arr, first, last); } lib.Swap(arr, beg, first); Sort3(arr, beg, first - 1); Sort3(arr, first + 1, end); } } }