从左向右依次递归 如果 数组中的元素都相等,就会变成 n²级别的复杂度算法

public class QuickSort
{
    private QuickSort() { }
    public static void Sort<T>(T[] arr) where T : System.IComparable<T>
    {
        Sort(arr, 0, arr.Length - 1 ,  new System.Random() );

    }
    public static void Sort2<T>(T[] arr) where T : System.IComparable<T>
    {
        Sort2(arr, 0, arr.Length - 1 ,new System.Random());

    }
    private static void Sort<T>(T[] arr, int l, int r ,System.Random  random) where T : System.IComparable<T>
    {
        // 改为插入排序
        if (l >= r) return;
        int p = partition(arr, l, r,random);
        Sort(arr, l, p - 1,random);
        Sort(arr, p + 1, r,random);
    }
    private static void Sort2<T>(T[] arr, int l, int r,System.Random  random) where T : System.IComparable<T>
    {
        // 改为插入排序
        if (r - l <= 8)
        {
            // 调用 插入排序算法类中的方法 如果不存在就调用下面的
            InsertionSort.Sort(arr, l, r);
            //本类插入排序
            // insertionSort(arr, l, r);
            return;
        }
        int p = partition(arr, l, r,  random);
        Sort(arr, l, p - 1,random);
        Sort(arr, p + 1, r,random);
    }
    private static int partition<T>(T[] arr, int l, int r,System.Random  random) where T : System.IComparable<T>
    {
        //随机 l 到r之间的随机数
     //   System.Random random = new System.Random();
        int p = l + random.Next(r-l + 1);

        swap(arr, l, p);

        //  left  arr[l+1....j] <v  right arr[j+1....i]>= v
        int j = l;
        for (var i = l + 1; i <= r; i++)
        {
            if (arr[i].CompareTo(arr[l]) < 0)
            {
                j++;
                swap(arr, i, j);

            }
        }
        swap(arr, l, j);
        return j;
    }

    private static void swap<T>(T[] arr, int i, int j) where T : System.IComparable<T>
    {
        var temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;

    }
    public static void insertionSort<T>(T[] data, int l, int r) where T : System.IComparable<T>
    {
        for (var i = l; i <= r; i++)
        {
            T temp = data[i];
            int j;
            for (j = i; j > l; j--)
            {
                if (temp.CompareTo(data[j - 1]) < 0)
                {
                    data[j] = data[j - 1];
                }
                else
                {
                    break;
                }
            }
            data[j] = temp;
        }
    }
};

左右依次遍历 就能避免这种问题

 

双路排序算法

public class QuickSort
{
    private QuickSort() { }
    public static void Sort<T>(T[] arr) where T : System.IComparable<T>
    {
        Sort(arr, 0, arr.Length - 1, new System.Random());

    }
    public static void Sort2<T>(T[] arr) where T : System.IComparable<T>
    {
        Sort2(arr, 0, arr.Length - 1, new System.Random());

    }
    private static void Sort<T>(T[] arr, int l, int r, System.Random random) where T : System.IComparable<T>
    {
        // 改为插入排序
        if (l >= r) return;
        int p = partition(arr, l, r, random);
        Sort(arr, l, p - 1, random);
        Sort(arr, p + 1, r, random);
    }
    private static void Sort2<T>(T[] arr, int l, int r, System.Random random) where T : System.IComparable<T>
    {
        // 改为插入排序
        if (r - l <= 8)
        {
            // 调用 插入排序算法类中的方法 如果不存在就调用下面的
            InsertionSort.Sort(arr, l, r);
            //本类插入排序
            // insertionSort(arr, l, r);
            return;
        }
        int p = partition(arr, l, r, random);
        Sort(arr, l, p - 1, random);
        Sort(arr, p + 1, r, random);
    }
    private static int partition<T>(T[] arr, int l, int r, System.Random random) where T : System.IComparable<T>
    {
        //随机 l 到r之间的随机数
        //   System.Random random = new System.Random();
        int p = l + random.Next(r - l + 1);

        swap(arr, l, p);

        //  left  arr[l+1....j] <v  right arr[j+1....i]>= v
        int j = l;
        for (var i = l + 1; i <= r; i++)
        {
            if (arr[i].CompareTo(arr[l]) < 0)
            {
                j++;
                swap(arr, i, j);

            }
        }
        swap(arr, l, j);
        return j;
    }

    private static void swap<T>(T[] arr, int i, int j) where T : System.IComparable<T>
    {
        var temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;

    }
    public static void insertionSort<T>(T[] data, int l, int r) where T : System.IComparable<T>
    {
        for (var i = l; i <= r; i++)
        {
            T temp = data[i];
            int j;
            for (j = i; j > l; j--)
            {
                if (temp.CompareTo(data[j - 1]) < 0)
                {
                    data[j] = data[j - 1];
                }
                else
                {
                    break;
                }
            }
            data[j] = temp;
        }
    }
    public static void Sort2Ways<T>(T[] arr) where T : System.IComparable<T>
    {
        Sort2Ways(arr, 0, arr.Length - 1, new System.Random());

    }
    private static void Sort2Ways<T>(T[] arr, int l, int r, System.Random random) where T : System.IComparable<T>
    {
        // 改为插入排序
        if (r - l <= 8)
        {
            // 调用 插入排序算法类中的方法 如果不存在就调用下面的
            // InsertionSort.Sort(arr, l, r);
            //本类插入排序
            insertionSort(arr, l, r);
            return;
        }
        int p = partition2Ways(arr, l, r, random);
        Sort(arr, l, p - 1, random);
        Sort(arr, p + 1, r, random);
    }
    private static int partition2Ways<T>(T[] arr, int l, int r, System.Random random) where T : System.IComparable<T>
    {
        //随机 l 到r之间的随机数
        //   System.Random random = new System.Random();
        int p = l + random.Next(r - l + 1);

        swap(arr, l, p);
        int i = l + 1, j = r;
        //  left  arr[l+1....j] <=v  right arr[j+1....i]>= v
        while (true)
        {
            //循环终止条件是 当前的i 》=0  循环条件是《0
            while (i <= j && arr[i].CompareTo(arr[l]) < 0)
            {
                i++;

            }
            while (j >= i && arr[j].CompareTo(arr[l]) > 0)
            {
                j--;
            }
            if (i >= j)
            {
                break;
            }
            swap(arr, i, j);
            i++;
            j--;
        }
        swap(arr, l, j);
        return j;
    }
};

三路快速排序

public class QuickSort
{
    private QuickSort() { }
    public static void Sort<T>(T[] arr) where T : System.IComparable<T>
    {
        Sort(arr, 0, arr.Length - 1, new System.Random());

    }
    public static void Sort2<T>(T[] arr) where T : System.IComparable<T>
    {
        Sort2(arr, 0, arr.Length - 1, new System.Random());

    }
    private static void Sort<T>(T[] arr, int l, int r, System.Random random) where T : System.IComparable<T>
    {
        // 改为插入排序
        if (l >= r) return;
        int p = partition(arr, l, r, random);
        Sort(arr, l, p - 1, random);
        Sort(arr, p + 1, r, random);
    }
    private static void Sort2<T>(T[] arr, int l, int r, System.Random random) where T : System.IComparable<T>
    {
        // 改为插入排序
        // if (r - l <= 8)
        // {
        //     // 调用 插入排序算法类中的方法 如果不存在就调用下面的
        //     InsertionSort.Sort(arr, l, r);
        //     //本类插入排序
        //     // insertionSort(arr, l, r);
        //     return;
        // }

        if (l >= r)
        {
            // 调用 插入排序算法类中的方法 如果不存在就调用下面的
            // InsertionSort.Sort(arr, l, r);
            //本类插入排序
            // insertionSort(arr, l, r);
            return;
        }
        int p = partition(arr, l, r, random);
        Sort2(arr, l, p - 1, random);
        Sort2(arr, p + 1, r, random);
    }
    private static int partition<T>(T[] arr, int l, int r, System.Random random) where T : System.IComparable<T>
    {
        //随机 l 到r之间的随机数
        //   System.Random random = new System.Random();
        int p = l + random.Next(r - l + 1);

        swap(arr, l, p);

        //  left  arr[l+1....j] <v  right arr[j+1....i]>= v
        int j = l;
        for (var i = l + 1; i <= r; i++)
        {
            if (arr[i].CompareTo(arr[l]) < 0)
            {
                j++;
                swap(arr, i, j);

            }
        }
        swap(arr, l, j);
        return j;
    }

    private static void swap<T>(T[] arr, int i, int j) where T : System.IComparable<T>
    {
        var temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;

    }
    public static void insertionSort<T>(T[] data, int l, int r) where T : System.IComparable<T>
    {
        for (var i = l; i <= r; i++)
        {
            T temp = data[i];
            int j;
            for (j = i; j > l; j--)
            {
                if (temp.CompareTo(data[j - 1]) < 0)
                {
                    data[j] = data[j - 1];
                }
                else
                {
                    break;
                }
            }
            data[j] = temp;
        }
    }
    public static void Sort2Ways<T>(T[] arr) where T : System.IComparable<T>
    {
        Sort2Ways(arr, 0, arr.Length - 1, new System.Random());

    }
    private static void Sort2Ways<T>(T[] arr, int l, int r, System.Random random) where T : System.IComparable<T>
    {
        // 改为插入排序
        if (r - l <= 2)
        {
            // 调用 插入排序算法类中的方法 如果不存在就调用下面的
            // InsertionSort.Sort(arr, l, r);
            //本类插入排序
            insertionSort(arr, l, r);
            return;
        }

        int p = partition2Ways(arr, l, r, random);
        Sort2Ways(arr, l, p - 1, random);
        Sort2Ways(arr, p + 1, r, random);
    }
    private static int partition2Ways<T>(T[] arr, int l, int r, System.Random random) where T : System.IComparable<T>
    {
        //随机 l 到r之间的随机数
        //   System.Random random = new System.Random();
        int p = l + random.Next(r - l + 1);

        swap(arr, l, p);
        int i = l + 1, j = r;
        //  left  arr[l+1....j] <=v  right arr[j+1....i]>= v
        while (true)
        {
            //循环终止条件是 当前的i 》=0  循环条件是《0
            while (i <= j && arr[i].CompareTo(arr[l]) < 0)
            {
                i++;

            }
            while (j >= i && arr[j].CompareTo(arr[l]) > 0)
            {
                j--;
            }
            if (i >= j)
            {
                break;
            }
            swap(arr, i, j);
            i++;
            j--;
        }
        swap(arr, l, j);
        return j;
    }
    public static void Sort3Ways<T>(T[] arr) where T : System.IComparable<T>
    {
        Sort3Ways(arr, 0, arr.Length - 1, new System.Random());

    }
    private static void Sort3Ways<T>(T[] arr, int l, int r, System.Random random) where T : System.IComparable<T>
    {
        if (l >= r) return;
        var p = partition3Ways(arr, l, r, random);
        Sort3Ways(arr, l, p.Item1, random);
        Sort3Ways(arr, p.Item2, r, random);
    }
    private static (int, int) partition3Ways<T>(T[] arr, int l, int r, System.Random random) where T : System.IComparable<T>
    {
        //随机 l 到r之间的随机数
        int p = l + random.Next(r - l + 1);

        swap(arr, l, p);
        int lt = l, i = l + 1, gt = r + 1;
        // arr[l+1, lt] <v   arr [ lt+1,i-1]==v   arr[gr,r]>v
        while (i < gt)
        {
            if (arr[i].CompareTo(arr[l]) < 0)
            {
                lt++;
                swap(arr, i, lt);
                i++;
            }
            else if (arr[i].CompareTo(arr[l]) == 0)
            {
                i++;
            }
            else if (arr[i].CompareTo(arr[l]) > 0)
            {
                gt--;
                swap(arr, i, gt);
            }
        }
        swap(arr, l, lt);
        // arr[l, lt-1] <v   arr [ lt,i-1]==v   arr[gr,r]>v

        return (lt-1, gt);
    }
};