在网上看到一种排序算法,我是菜鸟,弱弱的问下高手

lr5420511 2012-06-13 12:46:43
这个算法叫什么名字啊!!怎么以前都没怎么看见过?在网上无意看到的,跪求高手......

代码如下:
private int[] GetNum;

/// <summary>
/// int数组升序排列
/// </summary>
/// <param name="NodeNum">源数组</param>
/// <returns></returns>
private int[] GetIntListOrderBy(int[] SourceNum)
{
GetNum = new int[SourceNum.Length];
for (int i = 0; i < SourceNum.Length; i++)
{
int NewPosion = 0;
int Num = SourceNum[i];
for (int j = 0; j < SourceNum.Length; j++)
{
if (Num > SourceNum[j])
NewPosion++;
else
continue;
}
NextNum(NewPosion, Num);
}
return GetNum;
}

/// <summary>
/// 相同的整数后推一位
/// </summary>
/// <param name="posion"></param>
/// <param name="num"></param>
private void NextNum(int posion, int num)
{
if (GetNum[posion] != num)
GetNum[posion] = num;
else
NextNum(posion + 1, num);
}
...全文
419 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
lr5420511 2012-06-14
  • 打赏
  • 举报
回复
这样做会不会好很多?
public static void Sort(int[] A, int k)
{
Debug.Assert(k > 0);
Debug.Assert(A != null);

int[] C = new int[k + 1];

for (int j = 0; j < A.Length; j++)
{
C[A[j]]++;
}

int z = 0;

for (int i = 0; i <= k; i++)
{
while (C[i]-- > 0)
{
A[z++] = i;
}
}
}
txzsp 2012-06-14
  • 打赏
  • 举报
回复
比较性的排序都不过了O(nlogn)这关的。
lr5420511 2012-06-13
  • 打赏
  • 举报
回复
但是NextNum(int posion, int num)方法好像不是用来作交换吧,原作者说是避免排序的原数组中有相同的数时出现错误。 还有就是我试了下,效率好低啊
nikolaichow 2012-06-13
  • 打赏
  • 举报
回复
从小到大排序
bdmh 2012-06-13
  • 打赏
  • 举报
回复
就是冒泡排序的本质,只不过把交换这一块,拿出来单独写了个方法
Delta 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
就是冒泡排序的本质,只不过把交换这一块,拿出来单独写了个方法
[/Quote]呵呵,学习了。。。
apple1qaz 2012-06-13
  • 打赏
  • 举报
回复
冒泡排序相当经典, 学C++的时候,仔细学习和练习过,对后来工作挺有用的!
一定要沉下心去写!
setoy 2012-06-13
  • 打赏
  • 举报
回复
是计数排序
不过写成了O(n^2)的复杂度,太痤了吧~普通的冒泡也比它效率高
Pis117435947 2012-06-13
  • 打赏
  • 举报
回复
这代码。。。。。。。。这么繁琐效率不低才怪!!!!!!
无力继续 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
这个算法叫什么名字啊!!怎么以前都没怎么看见过?在网上无意看到的,跪求高手......

代码如下:
private int[] GetNum;

/// <summary>
/// int数组升序排列
/// </summary>
/// <param name="NodeNum">源数组</param>
/// ……
[/Quote]
lr5420511 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

引用 14 楼 的回复:

引用 9 楼 的回复:

C# code

private void NextNum(int posion, int num)
{
if (GetNum[posion] != num)
GetNum[posion] = num;
else
NextNum(posion + 1, num);
}



这函数写的,居然在里面用到全局变……
[/Quote]

学习了,嘿嘿!如果这样您看行不?
/// <summary>
/// int数组升序排列
/// </summary>
/// <param name="NodeNum">源数组</param>
/// <returns></returns>
private int[] GetIntListOrderBy(int[] SourceNum)
{
int[] GetNum = new int[SourceNum.Length];
for (int i = 0; i < SourceNum.Length; i++)
{
int NewPosion = 0;
int Num = SourceNum[i];
for (int j = 0; j < SourceNum.Length; j++)
{
if (Num > SourceNum[j])
NewPosion++;
else
continue;
}
NextNum(NewPosion, Num, GetNum);
}
return GetNum;
}

/// <summary>
/// 相同的整数后推一位
/// </summary>
/// <param name="posion"></param>
/// <param name="num"></param>
private void NextNum(int posion, int num, int[] GetNum)
{
if (GetNum[posion] != num)
GetNum[posion] = num;
else
NextNum(posion + 1, num);
}
showlie 2012-06-13
  • 打赏
  • 举报
回复
另外,如果你想了解算法的原理,可以找谭浩强的那本蓝皮《数据结构》里面都是最经典的算法。
如果你只是想使用算法,.net里面System.Collections命名空间中的算法不要太多。
showlie 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

引用 9 楼 的回复:

C# code

private void NextNum(int posion, int num)
{
if (GetNum[posion] != num)
GetNum[posion] = num;
else
NextNum(posion + 1, num);
}



这函数写的,居然在里面用到全局变量。。。


额,我看了下 ……
[/Quote]
个人见解:
1、函数的功能粒度最小化,也就是一个函数实现最小的功能性算法。复杂的函数通过“小”函数的组合来实现。打个比方,加减乘除算数表达式,加、减、乘、除都是一个最小功能的函数实现,然后通过这些函数的组合来实现复杂的算数表达式,而不是写一个“混合功能”的算数函数。
2、函数的封闭性。函数通过参数来实现数据的输入,通过返回值或引用参数返回结果,不要在中间莫名奇妙的引用全局变量,函数的目的就是写一遍,任何地方都可以使用,而这样严重破坏了函数的独立性。
lr5420511 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

C# code

private void NextNum(int posion, int num)
{
if (GetNum[posion] != num)
GetNum[posion] = num;
else
NextNum(posion + 1, num);
}



这函数写的,居然在里面用到全局变量。。。
[/Quote]

额,我看了下 确实是的,但是为什么这样做不好呢?高手教我,我是菜鸟
lr5420511 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

现在的人都很浮躁,学校的老师乱讲,很多开发的菜鸟也是人云亦云。
排序算法有很多种:选择排序、快速排序、冒泡排序等等。。。
什么是冒泡排序?为什么叫冒泡排序?这是一种形象的比喻。
冒泡排序的本质是比较两个相邻的数,否则,根本不是冒泡排序

我以前招人有一个上机题,就是冒泡排序,结果 95%的人做错!
[/Quote]

高人,我在网上看到的这个是叫什么排序呀?虚心求教
lr5420511 2012-06-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

好的算法可以参考,但是这个,我想还是算了,不做评价。。。
[/Quote]

我是菜鸟,求高手解释
baiwenyu 2012-06-13
  • 打赏
  • 举报
回复
现在的人都很浮躁,学校的老师乱讲,很多开发的菜鸟也是人云亦云。
排序算法有很多种:选择排序、快速排序、冒泡排序等等。。。
什么是冒泡排序?为什么叫冒泡排序?这是一种形象的比喻。
冒泡排序的本质是比较两个相邻的数,否则,根本不是冒泡排序

我以前招人有一个上机题,就是冒泡排序,结果 95%的人做错!
showlie 2012-06-13
  • 打赏
  • 举报
回复
好的算法可以参考,但是这个,我想还是算了,不做评价。。。
showlie 2012-06-13
  • 打赏
  • 举报
回复

private void NextNum(int posion, int num)
{
if (GetNum[posion] != num)
GetNum[posion] = num;
else
NextNum(posion + 1, num);
}


这函数写的,居然在里面用到全局变量。。。
lr5420511 2012-06-13
  • 打赏
  • 举报
回复
谁来教我一下啊!!大哥们
加载更多回复(3)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧