簡體   English   中英

如何修改我的快速排序算法,以便可以對Double數據類型數組進行排序?

[英]How do I modify my Quick Sort Algorithm so that it can sort Double data type arrays?

我使用這種快速排序算法對整數數組進行排序,但我也希望它對雙精度數組進行排序。 為了使這項工作有效,我需要更改哪些變量? 我嘗試更改許多不同的數據類型組合。

任何幫助表示贊賞。

       static void Main(string[] args)
    {

     double[] myArray_3 = { 25.1573, 5.1437, 8.1421, 3.1625, 12.3187, 2.8465, 78.0454, -32.6666, -
     51.9204, -31.9391, -30.6136, -12.1411, -4.7172, -6.1189, 15.1574, 10.8995, 21.0344, 49.7912};
     double[] myArray_4 = {-56.6149, -27.4997, 17.1503, -1.5368, -31.3245, -17.5386, 6.9865, -27.8045,
     27.2986, -17.9399, 50.6482, -30.2363, 5.5773, -42.5887, -20.2617, -16.6110, 11.2374,
     26.3797, 8.4136, -10.4460, 22.8337, 22.3688, 3.3657, 15.9949, 11.5583, -27.6349, 21.2679, -
     18.4016, -16.9097, 4.9545, -8.6101, -3.6910};

        QuickSort(myArray_3);

        foreach (int item in myArray_3)
        {
            Console.WriteLine(item);
        }

    }
    public static void QuickSort(int[] data)
    {
        Quick_Sort(data, 0, data.Length - 1);
    }

    public static void Quick_Sort(int[] data, int left, int right)
    {
        int i, j;
        int pivot, temp;
        i = left;
        j = right;
        pivot = data[(left + right) / 2];
        do
        {
            while ((data[i] < pivot) && (i < right)) i++;
            while ((pivot < data[j]) && (j > left)) j--;
            if (i <= j)
            {
                temp = data[i];
                data[i] = data[j];
                data[j] = temp;
                i++;
                j--;
            }
        } while (i <= j);
        if (left < j) Quick_Sort(data, left, j);
        if (i < right) Quick_Sort(data, i, right);
    }

您應該能夠使用泛型,其中類型實現IComparable<T> ,以便您可以比較各項(不能在泛型類型上使用<>運算符)。

這應該可以解決問題:

public static void QuickSort<T>(T[] data) where T:IComparable<T>
{
    Quick_Sort(data, 0, data.Length - 1);
}

public static void Quick_Sort<T>(T[] data, int left, int right) where T:IComparable<T>
{
    int i, j;
    T pivot, temp;
    i = left;
    j = right;
    pivot = data[(left + right) / 2];

    do
    {
        while ((data[i].CompareTo(pivot) < 0) && (i < right)) i++;
        while ((pivot.CompareTo(data[j]) < 0) && (j > left)) j--;
        if (i <= j)
        {
            temp = data[i];
            data[i] = data[j];
            data[j] = temp;
            i++;
            j--;
        }
    } while (i <= j);

    if (left < j) Quick_Sort(data, left, j);
    if (i < right) Quick_Sort(data, i, right);
}

無論您決定選擇什么:


安全使用浮點數

定義雙精度浮點數相等的可靠方法不是operator== 它是:

(a - b < Double.Epsilon)


專門針對Quicksort

Quicksort起初看起來很簡單,但有很多陷阱。 第一個是它具有最壞情況的性能,可以是二次方的。 如果要發布自己的快速排序,則需要知道如何減輕這些情況:

  1. 排序前先將數組隨機排列。 這是保證性能的必要條件。 具體來說,如果數組呈現某些順序,則Hoare分區方案(用於快速排序的原始分區方案)會降低性能。

  2. 請記住,Quicksort不是穩定的排序算法。 這意味着您不能按照多個條件進行排序,因為該順序不會在嵌套排序中保留。

  3. 荷蘭國旗問題。 如果允許重復的值,則最終會出現一個胖分區,該分區會使quicksort在二次時間內運行( O(n^2) )。 這可以通過快速排序變體(例如3路快速排序)來解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM