C# 一种使用二进制方法的快速冒泡排序变体
我一直在做一些面试问题的准备,在这个过程中,我提出了一个关于冒泡排序的小变体,它将我学到的关于二进制搜索的知识整合到了交换的内部循环中。因此,时间复杂度比O(n^2)大约降低了50%。我想我的问题是我是不是在浪费时间搞泡泡排序?我应该学习桶排序并完成它吗 我一直在使用以下输入进行测试C# 一种使用二进制方法的快速冒泡排序变体,c#,algorithm,sorting,bubble-sort,bucket-sort,C#,Algorithm,Sorting,Bubble Sort,Bucket Sort,我一直在做一些面试问题的准备,在这个过程中,我提出了一个关于冒泡排序的小变体,它将我学到的关于二进制搜索的知识整合到了交换的内部循环中。因此,时间复杂度比O(n^2)大约降低了50%。我想我的问题是我是不是在浪费时间搞泡泡排序?我应该学习桶排序并完成它吗 我一直在使用以下输入进行测试 int[] nums = { 9878, 1, 4, 8, 5, 7, 88, 1, 54, 2, 2, 9878, 5, 7, 3, 11, 1, 4, 8, 5, 7, 88, 1, 54, 2, 2, 5,
int[] nums = { 9878, 1, 4, 8, 5, 7, 88, 1, 54, 2, 2, 9878, 5, 7, 3, 11, 1, 4, 8, 5, 7, 88, 1, 54, 2, 2, 5, 7, 3, 11 };
public static int[] sortWBinary(int[] ar)
{
var swapped = true;
for (int i = 0; i < ar.Length && swapped; i++)
{
swapped = false;
for (int k = i, j = ar.Length - 1; k < ar.Length - i - 1 && j > 0; k++, j--)
{
if (ar[k] > ar[k + 1])
{
var temp = ar[k];
ar[k] = ar[k + 1];
ar[k + 1] = temp;
swapped = true;
}
if (ar[j - 1] > ar[j])
{
var temp = ar[j - 1];
ar[j - 1] = ar[j];
ar[j] = temp;
swapped = true;
}
}
}
return ar;
}
int[]nums={9878,1,4,8,5,7,88,1,54,2,2,9878,5,7,3,11,1,4,8,5,7,88,1,54,2,2,5,7,3,11};
公共静态int[]sortWBinary(int[]ar)
{
var交换=真;
对于(int i=0;i0;k++,j--)
{
if(ar[k]>ar[k+1])
{
var-temp=ar[k];
ar[k]=ar[k+1];
ar[k+1]=温度;
交换=真;
}
if(ar[j-1]>ar[j])
{
var-temp=ar[j-1];
ar[j-1]=ar[j];
ar[j]=温度;
交换=真;
}
}
}
返回ar;
}
VS.
public static int[] sortWoBinary(int[] ar)
{
var swapped = true;
for (int i = 0; i < ar.Length && swapped; i++)
{
swapped = false;
for (int k = 0; k < ar.Length - i - 1; k++)
{
if (ar[k] > ar[k + 1])
{
var temp = ar[k];
ar[k] = ar[k + 1];
ar[k + 1] = temp;
swapped = true;
}
}
}
return ar;
}
公共静态int[]sortWoBinary(int[]ar)
{
var交换=真;
对于(int i=0;iar[k+1])
{
var-temp=ar[k];
ar[k]=ar[k+1];
ar[k+1]=温度;
交换=真;
}
}
}
返回ar;
}
对于排序,请了解O(n log(n))
和O(n^2)
之间的区别,并知道如果您有足够的数据关心您正在做的事情,您总是希望使用前者
以下是你应该能够谈论的所有类型。如果我在面试你,我只在乎你知道前两个。在告诉您如何编写之后,我可能会要求您实现第三个,但我不在乎您是否知道它
sort
实用程序或SQL中的orderby
函数。当您需要随意处理数据并进行选择时,不要将其吸入内存进行排序,而是首先将其排序到更有效的位置O(n log(n))
更快排序,你需要知道这一点。知道答案可能会让他们更加努力地工作,以表明他们的书呆子资历比你的好。这将是我不愿意与他们合作的标志在我看来,学习“最佳”排序方法是浪费时间。如果您使用的是C#,那么唯一需要的排序方法就是
source.sort()
。对.NETAPI、流行框架和CICD的了解将使您在这个世界上走得更远。我的意思是,你改变了现有的排序算法,现在正在寻找改进算法的方法,这一事实向我表明你有解决问题的能力和团队合作意识。这比复杂的排序算法知识更有价值。你为什么说第一个aproach要快50%。这两种方法的复杂度是相同的(除了你想并行执行第一种方法),我取了这两种方法之间关于各自迭代次数的差值,然后除以原始执行的迭代次数。结果是大约有50%的变化。这是有意义的,因为我们可能会在每次迭代中进行两次交换,而在每次外部循环的迭代中,内部循环的下限增量会增加一倍。因此,对于内部的不完全对数(n),但更接近。@cSkillzMartin没有最佳排序算法。每个都有其用途,其选择取决于数据集属性、大小、可用内存等。。。使用冒泡排序在某些情况下是可以的,在其他情况下则不是。。。同样适用于快速排序、合并排序、桶排序和所有其他。。。在某些情况下,冒泡排序可能比快速排序更快,甚至比桶式排序更快,而在另一些情况下,冒泡排序无法。。。