- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
目前我正在学习快速排序。我遵循了快速排序规则;但我发现了一件奇怪的事。
过程就像这张图
请帮我找出我错在哪里:
代码如下:
static void QuickSortFromMiddle(int[] arr, int low, int high)
{
if (low < high)
{
int middleValue = arr[(low+high)/2];
int h = high+1;
int l = low-1;
while (l < h)
{
while (arr[--h] > middleValue && l<h);
while (arr[++l] < middleValue && l<h) ;
if (l >= h)
break;
int temp = arr[l];
arr[l] = arr[h];
arr[h] = temp;
}
QuickSortFromMiddle(arr,low,l-1);
QuickSortFromMiddle(arr, h+1, high);
}
}
/// <summary>
///
/// </summary>
static void QuickSort(int[] arr)
{
QuickSortFromMiddle(arr, 0, arr.Length - 1);
}
/// <summary>
///
/// </summary>
static void TestQuickSort()
{
var arr = new[] { 1, 5, 3, 4, 57, 5, 5, 53 };
QuickSort(arr);
foreach (int i in arr)
{
Console.WriteLine(i);
}
}
这是结果(我很困惑......)
正如 Dukeling 所说“枢轴通常移动到两端”
首先,我应该把枢轴放在数组的末尾
其次,我应该把枢轴放在arr的右边(大于左边,小于右边)
这是正确的过程:
最佳答案
整体算法如下:
分区有多种方案,只要满足条件,任何一种方案都可以。您的分区方案是我以前从未见过的。特别是,我从未见过将位于中心的值作为枢轴的快速排序分区方案。请看the wikipedia page对于一些标准分区方案(例如 Lomuto)。
总体而言,您的分区方案存在以下限制:
arr[l]
和 arr[h]
之前,您甚至不检查它们是否需要交换。您只是假设在初始移动 l
和 h
(两个内部 while 循环)之后,所有其他数字都需要交换。您需要使您的分区方案更通用,也许尝试理解和使用其中一种标准方案。
关于c# - 对快速排序感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48148130/
我正在尝试学习Rust。我正在阅读一本书online,该书实现了unix程序cat。现在,我试图读取作为像cargo run file1.txt file2.txt这样的参数传递的文件的内容,但是程序
我在 GHC 8.0.1 中遇到了一个带有种类索引 (?) GADT 的奇怪情况,其中在类型与种类签名中引入 foralls 会产生不同的类型检查行为。 考虑以下数据类型: {-# LANGUAGE
我正在使用 Perl 5.10 开发应用程序,HTML::Mason和 Apache 2.2。这是我第一次在大型项目中使用 Perl 5.10。我每隔一段时间就会出现奇怪的行为。应用程序因一个非常奇怪
我正在尝试将文件上传到aws中的rust中,因为我使用的是 rusoto_s3 的s3 rust客户端,当这些部分从单个线程发送时,我设法使分段上传代码正常工作不是我想要的,我想上传大文件,并且希望能
我是一名优秀的程序员,十分优秀!