示例#1
0
        private static void MergeSort <T>(ListSlice <T> list) where T : System.IComparable, System.IComparable <T>
        {
            if (list.Count > 2)
            {
                int mid   = list.Count / 2;
                var left  = list.GetSlice(0, mid);
                var right = list.GetSlice(mid, list.Count - mid);

                MergeSort(left);
                MergeSort(right);

                Merging(left, right);
            }
            else
            {
                list.SwapIfGreater(0, list.Count - 1);
            }
        }
示例#2
0
        private static void MergeInsertionSort <T>(ListSlice <T> list, int threshold = 100) where T : System.IComparable <T>, System.IComparable
        {
            if (list.Count > 10)
            {
                int mid   = list.Count / 2;
                var left  = list.GetSlice(0, mid);
                var right = list.GetSlice(mid, list.Count - mid);

                MergeInsertionSort(left);
                MergeInsertionSort(right);

                Merging(left, right);
            }
            else
            {
                InsertionSort(list);
            }
        }
示例#3
0
        public static void HeapSort <T>(ListSlice <T> list) where T : System.IComparable <T>, System.IComparable
        {
            for (int i = list.Count / 2 - 1; i >= 0; i--)
            {
                heapify(list, i);
            }

            for (int i = list.Count - 1; i >= 0; i--)
            {
                list.Swap(0, i);

                heapify(list.GetSlice(0, i), 0);
            }
        }
示例#4
0
        private static void QuickSort <T>(ListSlice <T> list) where T : System.IComparable <T>, System.IComparable
        {
            if (list.Count == 3)
            {
                list.SwapIfGreater(0, 2);
                list.SwapIfGreater(1, 2);
                list.SwapIfGreater(0, 1);
            }
            else if (list.Count == 2)
            {
                list.SwapIfGreater(0, 1);
            }
            else if (list.Count <= 16)
            {
                InsertionSort(list);
            }
            else if (list.Count > 3)
            {
                int mid = Partation(list);

                QuickSort(list.GetSlice(0, mid));
                QuickSort(list.GetSlice(mid + 1, list.Count - mid - 1));
            }
        }