当前位置: 首页 > 知识库问答 >
问题:

如何修复这个快速排序?

阙奇思
2023-03-14

我用C#做了一个快速排序算法,当数组中只有10个项时,它可以工作。当我增加这个数字时,它就会陷入无限循环。这是问题所在的代码:

         while (true)
         {
            while (((IComparable)arrayToSort[left]).CompareTo(pivot) < 0)
            {
                left++;
            }

            while (((IComparable)arrayToSort[right]).CompareTo(pivot) > 0)
            {
                right--;
            }

            if (left < right) //This is where the loop becomes infinite.
            {
                object temp =arrayToSort[right];
                arrayToSort[right] = arrayToSort[left];
                arrayToSort[left] = temp;
                reDrawer.reDrawSample(right, g, arrayToSort, picSamples); //This is used to draw lines that are sorted to make the sorting visual.
                reDrawer.reDrawSample(left, g, arrayToSort, picSamples);
                refresher.refreshPicture(picSamples); //This is used to refresh the image with the lines.
                Thread.Sleep(20);
            }
            else
            {
                return right;
            }
class Quick_Sort
{
    /// <summary>
    /// This subroutine creates a pivot and partitions the array accordingly.
    /// </summary>
    /// <param name="arrayToSort"></param>
    /// <param name="left"></param>
    /// <param name="right"></param>
    /// <returns></returns>
    public int partition(ArrayList arrayToSort, int left, int right)
    {
        int pivot = (int)arrayToSort[left];
        ReDrawer reDrawer = new ReDrawer();
        Refresher refresher = new Refresher();

        while (true)
        {
            while (((IComparable)arrayToSort[left]).CompareTo(pivot) < 0)
            {
                left++;
            }

            while (((IComparable)arrayToSort[right]).CompareTo(pivot) > 0)
            {
                right--;
            }

            if (left < right)
            {
                object temp =arrayToSort[right];
                arrayToSort[right] = arrayToSort[left];
                arrayToSort[left] = temp;
                reDrawer.reDrawSample(right, g, arrayToSort, picSamples);
                reDrawer.reDrawSample(left, g, arrayToSort, picSamples);
                refresher.refreshPicture(picSamples);
                Thread.Sleep(speed);
            }
            else
            {
                return right;
            }
        }
    }

    /// <summary>
    /// This recursive subroutine is responsible for sorting the array into the correct order after the individual partitions have been ordered.
    /// </summary>
    /// <param name="arr"></param>
    /// <param name="left"></param>
    /// <param name="right"></param>
    public void sortArray(ArrayList arr, int left, int right)
    {
        if (left < right)
        {
            int pivot = partition(arr, left, right);

            if (pivot > 1)
            {
                sortArray(arr, left, pivot - 1);
            }

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

}

当调用sortArray时,left=0,right=49&array是一个随机的50个元素的一维数组。

您可以忽略对reDrawer和refresher的引用,因为这些不会影响排序算法,它们只会在图片框中绘制结果。

共有1个答案

锺离慈
2023-03-14

当right==pivot或left==pivot时发生。

你是对的,在这种情况下,你在左/右停下来。您需要在每次迭代中至少输入/减少这两个变量一次。

public int partition(ArrayList arrayToSort, int left, int right)
{
    int pivot = (int)arrayToSort[left];
    left--;
    right++;  //To prevent the first iteration from ignoring the outermost elements
    ReDrawer reDrawer = new ReDrawer();
    Refresher refresher = new Refresher();

    while (true)
    {
        do
        {
            left++;
        }while (((IComparable)arrayToSort[left]).CompareTo(pivot) < 0);

        do
        {
            right--;
        }while (((IComparable)arrayToSort[right]).CompareTo(pivot) > 0);

        if (left < right)
        {
            object temp =arrayToSort[right];
            arrayToSort[right] = arrayToSort[left];
            arrayToSort[left] = temp;
            reDrawer.reDrawSample(right, g, arrayToSort, picSamples);
            reDrawer.reDrawSample(left, g, arrayToSort, picSamples);
            refresher.refreshPicture(picSamples);
            Thread.Sleep(speed);
        }
        else
        {
            return right;
        }
    }
}
 类似资料:
  • 主要内容:Eclipse 快速修复Eclipse 快速修复 当您在 Eclipse 编辑器中键入字符时,它会分析文档内容中是否存在潜在的错误和警告。java 编辑器使用 java 语法来检测代码中的错误。当它发现错误或警告时: 使用红色波浪线突出显示错误。 使用黄色波浪线突出显示警告。 显示错误和警告问题 向垂直标尺添加带有警告标志或错误标志的灯泡。 快速修复对话框提供了可能更正的列表。可以通过以下方式调用快速修复对话框  将鼠标

  • 使用快速修复 在 Eclipse 编辑器中当你输入字母时,编辑器会对你输入的内容进行错误分析。 Java 编辑器中使用 Java 语法来检测代码中的错误。当它发现错误或警告时: 使用红色波浪线突出错误 使用黄色的波浪线突出警告 在 Problem 视图中显示错误和警告 在垂直标尺上显示黄色小灯泡及警告和错误标识 快速修复的对话框提供了解决的方案。快速修复对话框可通过以下方式调用: 将鼠标指针放在波

  • 使用Quix修复 当您在eclipse编辑器中键入字符时,它会分析文档内容以查找潜在的错误和警告。 java编辑器使用java语法来检测代码中的错误。 当它发现错误或警告时,它 - 使用红色波浪线突出错误。 使用黄色波浪线突出警告。 显示错误和警告 问题视图。 添加带有警告标志或错误标志的灯泡到垂直标尺。 快速修复对话框提供了可能的更正列表。 可以通过以下方式调用快速修复对话框: 将鼠标指针放在波

  • 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两

  • 1. 前言 本节内容是排序算法系列之一:快速排序,主要讲解了快速排序的主体思路,选取了一个待排序的数字列表对快速排序算法进行了演示,给出了快速排序算法的 Java 代码实现,帮助大家可以更好地理解快速排序算法。 2. 什么是快速排序? 快速排序(Quick Sort),是计算机科学与技术领域中非常经典的一种排序算法,应用分治思想进行排序。 快速排序由于其时间复杂度优于大部分的排序算法,因而命名为快

  • 代码:import functools import json import os import tensorflow as tf import sys。路径附加(“C:\Users\Gilbertchristian\Documents\Anaconda\Object\u detection\u api\models\research”)系统。路径附加(“C:\Users\Gilbertchris