只循环一次的冒泡排序法---求解
如题,是否只循环一次就能实现冒泡排序,一般情况下都是需要嵌套循环2次的
int[] temps = { 10, 22, 4, 50, 100, 65, 56, 98, 105, 200, 900, 1 };
求大神祝我证道
[解决办法]
http://zh.wikipedia.org/wiki/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95
[解决办法]
这个是可以有的。
这里的一次循环并不是说时间复杂度就是O(n),冒泡排序的时间复杂度肯定是O(n2)的。
这道题考的只是一个编程技巧而已。
一直想写篇博客来着,不过没时间写。
//two loops
static void Sort(int[] array)
{
int length = array.Length;
for (int i = 0; i < length - 1; i++)
{
for (int j = 0; j < length - 1 - i; j++)
{
if (array[j] > array[j + 1])
{
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
//one loop
static void SortOneLoop(int[] array)
{
int length = array.Length;
int total = length * length - 1;
while (total / length > 0)
{
if (total % length >= length - total / length && array[total % length] < array[total % length - 1])
{
int temp = array[total % length];
array[total % length] = array[total % length - 1];
array[total % length - 1] = temp;
}
total--;
}
}
[解决办法]
http://www.cnblogs.com/CSharpSPF/archive/2012/03/14/2396728.html
博客也写了一下,可以去看看。
[解决办法]
不可能吧!
------解决方案--------------------
我一贯反对这种做法。没有带来任何改进,仅仅为了实现毫无意义的一种要求而把程序搞得非常难读,而且还导致运行效率大幅度下降。这样的技巧应该废弃。
[解决办法]
循环一次解决不了!...至少我没遇到,希望LZ发现 分享下
[解决办法]
有这必要吗?是技巧而已还是项目需要?
[解决办法]
1234
[解决办法]
谁说循环一次不行
int[] temps = { 10, 22, 4, 50, 100, 65, 56, 98, 105, 200, 900, 1 };
int[] result = new int[1000];
for (int i = 0; i < temps.Length; i++)
{
result[temps[i]] = temps[i];
}
for (int i = 0; i < result.Length; i++)
{
if (result[i]!=0) Console.WriteLine(result[i]);
}
[解决办法]
如果是实际项目需要,3楼的做法很实用。
#20楼虽然理论上可用,但是不觉得很浪费资源吗?如果其中一个最大的数是1亿,那按#20楼的做法是分配那么1亿个长度的数组空间吗?
[解决办法]
解决什么了?拿到这个结果的用户会直接崩溃掉的。
[解决办法]
没错,这样既没效率又浪费空间,只是根据问题给出的一个答案而已。
[解决办法]
只循环一遍...其实你建立一个 (On2) 的循环不是一样的么...
( ⊙ o ⊙ )
[解决办法]
真正的项目中我估计没人会去用一个循环写,我博客中也提到了这样效率较低。
但这应该只是一道面试题,这个技巧微软考过。
还有那些什么井盖的问题给实际项目也扯不上关系,但面试官就可能出这些问题。
归根到底,面试题而已。淡定...
[解决办法]
这是桶排序,不是冒泡排序。
[解决办法]
别说冒泡 我就没听说过O(n)的排序算法
[解决办法]
//int[] strAry = { 1, 5, 2, 4, 9, 6, 8, 10, 20, 16, 30, 11, 11 };
//var query =
// from vall in strAry
// orderby vall descending
// select vall;
//foreach(int s in query)
//{
// Response.Write(s.ToString() + "-");
//}
Linq 也 可以. . .....
[解决办法]
三楼 四楼的 方法 都可以,,
[解决办法]
11楼的方法学习了。
不要一味拘泥于“实用性”。如果只知道3楼的写法,充其量只是熟悉api的用法而已。11楼的方法看似无用,却能拓展思维。长远来说,这更重要
[解决办法]
如果你是想问技巧的,这个是可以有的
如果你是想把复杂度降为O(n),这个全世界的人都在盼着,如果你能研究出来,将名留千古,永载史册。
[解决办法]
冒泡排序只循环一次,这可以用两个字回答:扯淡。
[解决办法]
如果要卖弄一些“技巧”,并且非要说这样就是一个循环,我可以给出通用解法。但是如果你的老师把这个看成什么值得拿来玩弄的东西,我只能说他很低级。
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
Console.WriteLine("i = {0}, j = {0}", i, j);
=>
for (int i = 0, j = 0; i < 10; i += (((j = (++j % 10)) == 0) ? 1 : 0))
Console.WriteLine("i = {0}, j = {0}", i, j);
[解决办法]
很多人喜欢投机取巧地学习,比如有人说看几重循环就是复杂度。
[解决办法]
也许作为一种思维训练还是可以的。作为编程技巧的话,这样的做法有害无益。
[解决办法]
不要在这种问题上面纠结了,没意思,搞点有意义的事情吧。编程不仅仅是有循环。
[解决办法]
纠结这些,还不如去多做点实际的事情。
[解决办法]
LZ 当用递归方法时,有可能可以用一次循环可以排序,但是这里的一次循环是只写一个循环语句而以,理论上一个排序用一次循环来实现是不正常的
[解决办法]
你可以用 插入排序嘛。。。一次循环可以排好了。