簡體   English   中英

使用quicksort排序的數組

[英]Sorted array using quicksort

我有一個數組創建10個隨機整數,然后使用quicksort對它們進行排序。我的問題是,當我將其更改為創建1,000,000個隨機整數時,它不會這樣做。可以幫助嗎?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace RepeatAssignmentQ2
{
class Program
{
    static public int Partition(int[] myArray, int left, int right)
    {
        int pivot = myArray[left];
        while (true)
        {
            while (myArray[left] < pivot)
                left++;

            while (myArray[right] > pivot)
                right--;

            if (left < right)
            {
                int temp = myArray[right];
                myArray[right] = myArray[left];
                myArray[left] = temp;
            }
            else
            {
                return right;
            }

        }
    }

    static public void QuickSort_Recursive(int[] arr, int left, int right)
    {
        // For Recusrion
        if (left < right)
        {
            int pivot = Partition(arr, left, right);

            if (pivot > 1)
                QuickSort_Recursive(arr, left, pivot - 1);

            if (pivot + 1 < right)
                QuickSort_Recursive(arr, pivot + 1, right);
        }
    }

    static void Main(string[] args)
    {
        Random rnd = new Random();
        DateTime startTime = DateTime.Now;

        int ind = 0;
        int length = 1000000;
        int[] myArray = new int[length];

        while (ind < 1000000)
        {
            myArray[ind] = rnd.Next(1000000);
            ind++;
        }

        int lengthTwo = 10;

        Console.WriteLine("QuickSort by recursive method");

        QuickSort_Recursive(myArray,0, lengthTwo - 1 );



        for (int i = 0; i < 1000000; i++)
        {

            Console.WriteLine(myArray[i]);

        }
        Console.WriteLine("Total Time: {0}\n", DateTime.Now - startTime);
        Console.WriteLine();



    }
}
}

謝謝

編輯 - 當我使用具有10個數字的數組調試程序時,它將顯示它們並對它們進行排序。 當我將其更改為1,000,000並運行程序時,不顯示任何內容。

編輯2 - 好的,因為一些奇怪的原因它正在這樣做。 我更改了上面的代碼以顯示更改,它現在顯示它隨機生成的數字,但不對它們進行排序。 但是當IT只需要創建10個隨機數時,它就會對它進行排序。

填充和排序1,000,000個元素仍然應該非常快。

在分區方法中,您的alhorithm中存在錯誤。 如果left小於right你應該left增加right

if (left < right)
{
    int temp = myArray[right];
    myArray[right] = myArray[left];
    myArray[left] = temp;
    left++;
    right--;
}

如果myArray[left]大於或等於pivotmyArray[right]小於或等於pivot並且left小於right ,則分析程序的行為方式。 你有一個無限循環while (true) ,因為有兩個while s的忽略, if不改變的值leftright 如果數組中有重復項,則會出現這種情況。 例如,當您嘗試僅使用1,000個數字填充1,000,000個元素時,就會發生這種情況。

順便說一句。 如果用可變lengthlength替換每個1000000,你的代碼會更好。 lengthTwo可以用length替換。 為什么? 在這種情況下,當您想要檢查更大數組的程序行為時。 更改一個變量的值比五個數字更容易。

我希望我幫忙。

對不起,但你等了多久? 我懷疑填充1mil整數數組的while循環需要很長時間,因為它調用Next方法1,000,000次。 您是否看到以下輸出:'QuickSort by recursive method'?

我剛才偶然發現了這個錯誤,錯誤就在這里

QuickSort_Recursive(myArray,0,lengthTwo - 1);

改為

QuickSort_Recursive(myArray,0,length - 1);

對於你的分區,我認識到hoare的算法(比替代方案更快) https://cs.stackexchange.com/questions/11458/quicksort-partitioning-hoare-vs-lomuto這里的兩個偽代碼(你會看到我在開始時= p + 1和j = p-1否則它是好的)

雖然此回復距離提出問題的時間非常遠,但以下內容對於閱讀該問題的人來說非常有用。

問題中提到的代碼的問題是,只要兩端的樞軸元素相似(左側和右側),它就會在分區函數上產生無限循環

以下是修改后的代碼:

static int Partition(int[] myArray, int left, int right)
    {
        int pivot = myArray[left];
        while (true)
        {
            while (myArray[left] < pivot)
                left++;

            while (myArray[right] > pivot)
                right--;

            if (left < right && myArray[left] == myArray[right])
                left++;
            else if (left < right)
            {
                int temp = myArray[right];
                myArray[right] = myArray[left];
                myArray[left] = temp;
            }
            else
            {
                return right;
            }

        }
    }

暫無
暫無

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

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