如果是这样,你会说什么?

智者知已应修善业 2014-04-11 02:20:15
如果我说我这样写才是真的水泡,而它更像是丢进水中的石头?




int temp = 0, 次 = 0;
int[] arr = { 23, 23, 23, 23, 44, 66, 76, 98, 11, 3, 9, 7, 95, 45, 15, 78, 84, 51, 24, 12 };
Console.WriteLine("排序前的数组:");
foreach (int item in arr)
Console.Write(item + " ");
Console.WriteLine();

for (int i = 0; i < arr.Length - 1; i++)
{
for (int j = 0; j < arr.Length - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
次++;
}
}
Console.WriteLine("经典冒泡排序数组:");
foreach (int item in arr)
Console.Write(item + " ");
Console.WriteLine("\n" + 次 + "次\n");

arr = new int[] { 23, 23, 23, 23, 44, 66, 76, 98, 11, 3, 9, 7, 95, 45, 15, 78, 84, 51, 24, 12 };
次 = 0;
for (int i = 0; i < arr.Length - 1; i++)
{
if (arr[i] > arr[i + 1])
{
temp = arr[i + 1];
for (int j = i; j >= 0; j--)
{
if (arr[j] > arr[j + 1])
{
arr[j + 1] = arr[j];
arr[j] = temp;
}
次++;
}
}
}
Console.WriteLine("\n我的冒泡排序数组:");
foreach (int item in arr)
Console.Write(item + " ");
Console.WriteLine("\n" + 次 + "次\n");
...全文
1707 52 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
今天想起只为我设计的约瑟夫环的设计在百度知道另一贴131楼和133楼命名为"金箍"就是观音大士给孙悟空头上戴的金箍.
threenewbee 2014-04-24
  • 打赏
  • 举报
回复
我也不认识,三年前在北京,这个云计算大会见过他。当时fangxinggood也来的。 真是围城啊,程序员一个个都出家了,人家长老法师一个个都来搞IT了。
  • 打赏
  • 举报
回复
吾孤陋寡闻井底之蛙,乐闻其详,愿善人代为引荐结来时缘。
  • 打赏
  • 举报
回复
心到无别处,笑看风云起。
般若-金刚 2014-04-23
  • 打赏
  • 举报
回复
由于这个算法的特点想起了泡茶时水倒入茶杯时的情景水注下到底又升起,不如给起个有中国韵味的名称叫“沏茶排序”如何
般若-金刚 2014-04-23
  • 打赏
  • 举报
回复
下了本数据结构C#版的,查看了基础排序和高级排序例子,确实没看到这样的排序记录在档。 这是全新不同的排序算法,可以起个全新的名称,应该记录归档,个人这样认为。
threenewbee 2014-04-23
  • 打赏
  • 举报
回复
突然想问问你,这位龙泉寺的长老,你可认得?
  • 打赏
  • 举报
回复
因我皈依于观音殿,又屡蒙观音菩萨感应道交排忧解难,为感恩纪念观世音菩萨的慈悲(慈能与乐,悲能拔苦),又观世音菩萨别一名号为海潮音,海潮与我的算法特点很形象,因此,给我的排序算法正式命名为:海潮排序. 虽然我的算法来自于冒泡的启发,然思路与冒泡不相同的,其实我有很多都是自己构思设计出来的,其中最得意的该是对约瑟夫环的设计以及完美数、水仙数、质(素)数等等都是,虽然都在百度知道公布过,不过还是会逐步发布到我个人博客中留给后人参考。 约瑟夫环的设计在百度知道另一贴131楼和133楼
好好学习一下 2014-04-20
  • 打赏
  • 举报
回复
看了这个帖子,对我这个初学者还是有所收获的
般若-金刚 2014-04-19
  • 打赏
  • 举报
回复
都很精彩,思路的改变确实使性能的提高有了可比性,似乎在时间复杂度上处于快排和冒泡之间,即快排大约为:数组长度2次方/8、新算法大约为:数组长度2次方/4、冒泡大约为:数组长度2次方/2的左右就一般随机数组来说,在某些性能上优于冒泡和快排; 应该可以总结,并取个恰当的名称了。
引用 31 楼 caozhy 的回复:
不知道数据结构里面有没包含这个主题的精彩?有空也去看看,谢谢!
  • 打赏
  • 举报
回复
感谢诸位朋友们,这贴到今天这样,我好开心,好高兴. 接下来我用每次随机生成的数组来测试这三个代码:

int temp = 0; List <int> 随机数组 = new List <int>();
            foreach (var aa in new int[100]) { 随机数组.Add(new Random().Next(1, 99)); System.Threading.Thread.Sleep(40); }
            int[] arr = { 23, 23, 23, 23, 44, 66, 76, 98, 98, 98, 98, 11, 3, 9, 7, 95, 45, 15, 78, 84, 51, 24, 12, 23, 23, 23, 44, 66, 76, 98, 98, 98, 98, 11, 3, 9, 7, 95, 45, 15, 78, 84, 51, 24, 12 };
            arr = 随机数组.ToArray();
分别用第一次随机数组, 第二次小到大排序数组, 第三次大到小排序数组 事实胜于雄辩,用事实说话,可以看到: 快速排序确实对随机数组效率很好,但对于有序数组无论大小序效率一样 冒泡排序似乎无关痛痒 我的排序暂时给不同名称叫对冲吧,因为设计它的动作外环向下内环向上,可以看到对同向顺序数组和方向的不同表现以及随机数组的表现,假若随机数组中顺向越多则效率越好,推测其具有线性特征.
  • 打赏
  • 举报
回复
虽说提升不到哪,但不可否认的是继承冒泡的稳定性,在某些性能上更优于冒泡。
  • 打赏
  • 举报
回复
学习程序最快最有效果的方法就是自己重写,甘之如饴,乐子其中。
  • 打赏
  • 举报
回复
引用 35 楼 Ilovecoding 的回复:
看了一下你的排序方法,其实就是冒泡排序的修改版,还不能说是改进版。冒泡排序有一个改进的方法你没用,就是判断一下是否有数据交换,如果没有就认为排序结束。如果把这个方法加进去,有些情况下效率还能更高一些。 说白了,你的方法就是先判断一下是否存在数据交换的条件(if (arr[i] > arr[i + 1]) ),如果不存在就省去此次循环。而改进版的冒泡排序最后一遍有可能没交换任何数据,但累计次数却增加了。 一种极端的情况,比如数组int[] arr ={10,9,8,7,6,5,4,3,2,1}; 你再测试一下你的方法,效率是不是低了? 还有,你的这种方法还可以改进,效率更高: for (int i = 0; i < arr.Length - 1; i++) { if (arr[i] > arr[i + 1]) { temp = arr[i + 1]; for (int j = i; j >= 0; j--) { if (arr[j] > arr[j + 1]) { arr[j + 1] = arr[j]; arr[j] = temp; } else { break; }//此处跳出循环。 次++; } } 次++; } 感觉这种经典的算法肯定是经得起推敲的,不过楼主的专研精神值得称赞。
收到,谢谢!不错,本来我也觉得对于冒泡来说我这样写法更趋合理,经你这么一改就更合理了,只是大牛们说的也有道理,不需要用人家已有名称,我也接受这样提议,算法各有各的特点,不混淆也好。 明眼人都知道这种相邻交换其实提升不到哪去,与快排的跳换自然没的比,不过,快排也不完美,在有限的条件下会比快排好。 大家抬举了,其实谈不上钻研,纯属偶然,学习程序最快最有效果的方法就是自己重写。 在此,再次感谢朋友们,谢谢!!!
般若-金刚 2014-04-18
  • 打赏
  • 举报
回复
引用 35 楼 Ilovecoding 的回复:
看了一下你的排序方法,其实就是冒泡排序的修改版,还不能说是改进版。冒泡排序有一个改进的方法你没用,就是判断一下是否有数据交换,如果没有就认为排序结束。如果把这个方法加进去,有些情况下效率还能更高一些。 说白了,你的方法就是先判断一下是否存在数据交换的条件(if (arr[i] > arr[i + 1]) ),如果不存在就省去此次循环。而改进版的冒泡排序最后一遍有可能没交换任何数据,但累计次数却增加了。 一种极端的情况,比如数组int[] arr ={10,9,8,7,6,5,4,3,2,1}; 你再测试一下你的方法,效率是不是低了? 还有,你的这种方法还可以改进,效率更高: for (int i = 0; i < arr.Length - 1; i++) { if (arr[i] > arr[i + 1]) { temp = arr[i + 1]; for (int j = i; j >= 0; j--) { if (arr[j] > arr[j + 1]) { arr[j + 1] = arr[j]; arr[j] = temp; } else { break; }//此处跳出循环。 次++; } } 次++; } 感觉这种经典的算法肯定是经得起推敲的,不过楼主的专研精神值得称赞。
不错确实可以省些循环次数估计是遗漏了.
  • 打赏
  • 举报
回复
对冲排序这个名字不恰当,一时也想不出恰当的名词.
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
我的排序算法最大的特点就是紧凑没有多余的步骤. 在无序当中的表现虽不比快排高效总比冒泡高一点点. 从Cache和Swap分析推导性能也很好
Ilovecoding 2014-04-18
  • 打赏
  • 举报
回复
看了一下你的排序方法,其实就是冒泡排序的修改版,还不能说是改进版。冒泡排序有一个改进的方法你没用,就是判断一下是否有数据交换,如果没有就认为排序结束。如果把这个方法加进去,有些情况下效率还能更高一些。 说白了,你的方法就是先判断一下是否存在数据交换的条件(if (arr[i] > arr[i + 1]) ),如果不存在就省去此次循环。而改进版的冒泡排序最后一遍有可能没交换任何数据,但累计次数却增加了。 一种极端的情况,比如数组int[] arr ={10,9,8,7,6,5,4,3,2,1}; 你再测试一下你的方法,效率是不是低了? 还有,你的这种方法还可以改进,效率更高: for (int i = 0; i < arr.Length - 1; i++) { if (arr[i] > arr[i + 1]) { temp = arr[i + 1]; for (int j = i; j >= 0; j--) { if (arr[j] > arr[j + 1]) { arr[j + 1] = arr[j]; arr[j] = temp; } else { break; }//此处跳出循环。 次++; } } 次++; } 感觉这种经典的算法肯定是经得起推敲的,不过楼主的专研精神值得称赞。
般若-金刚 2014-04-17
  • 打赏
  • 举报
回复
看以上讨论不存在选择性排序一说。等待后面精彩。。。
加载更多回复(31)

13,190

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 分析与设计
社区管理员
  • 分析与设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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