C#快速排序疑惑

问题描述

如图所示,此算法将1000万个中最大的1000数排序消耗时间是2000+ms,有更快的排序算法吗?请附完整代码,谢谢!usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespace快速排序Bata2{usingSystem;publicstaticclassProgram{publicstaticvoidMain(){System.Diagnostics.Stopwatchwatch=newSystem.Diagnostics.Stopwatch();constintz=10000000;//随机生成一千万个数。int[]a=newint[z];Randomrandom=newRandom();for(inti=0;i<z;i++){a[i]=random.Next(0,z);}watch.Start();//计时器开始。QuickSort(a,0,z-1);watch.Stop();//计时器结束。for(inti=z-1000;i<z;i++){Console.WriteLine(a[i]);}stringtime=watch.ElapsedMilliseconds.ToString();Console.Write("排序所用时间:"+""+time+"ms");Console.Write("rn");}privatestaticvoidQuickSort(int[]a,intlow,inthigh){if(low>=high){return;}intpivot=QuickSortOnce(a,low,high);//输出每一次排序。//对枢轴左端进行排序。QuickSort(a,low,pivot-1);//对枢轴右端进行排序。QuickSort(a,pivot+1,high);}privatestaticintQuickSortOnce(int[]a,intlow,inthigh){//将首个元素作为枢轴。intpivot=a[low];inti=low,j=high;while(i<j){//从右往左,寻找首个小于povit的元素。while(a[j]>=pivot&&i<j){j--;}//执行到此,j一定指向从右端起首个小于或等于povit的元素。执行替换。a[i]=a[j];//从左往右,寻找首个大于povit的元素。while(a[i]<=pivot&&i<j){i++;}////执行到此,j一定指向从右端起首个大于或等于povit的元素。执行替换。a[j]=a[i];}//退出while循环,执行至此,必定是i==j的情况。i(或j)指向的既是枢轴的位置,定位该趟排序的枢轴并将该位置返回。a[i]=pivot;returni;}}}

解决方案

本帖最后由 sinat_32928967 于 2015-12-17 16:36:42 编辑
解决方案二:
Array.Sort(a);

解决方案三:
引用1楼shingoscar的回复:

Array.Sort(a);

?能详细解释吗?
解决方案四:
引用2楼sinat_32928967的回复:

Quote: 引用1楼shingoscar的回复:
Array.Sort(a);

?能详细解释吗?

.net自带排序函数,替换QuickSort你自己试试,要什么详细解释?
解决方案五:
你自己写一个希尔排序,你会发现比快排快。。。
解决方案六:
你那一堆的Console.WriteLine的时间就够你跑一会儿了一千次打印一个9个字符的字符串就接近两秒了字符串越多越耗时打印一个百度首页的html源码就能让你飞一会儿等个几秒钟。。在我用过的会的算法中就属归并排序最快了。。
解决方案七:
windows下的中断打印效率是很低的同样的代码放到linux上简直是天壤之别。。所以在需要效率的操作中重来不会去执行打印
解决方案八:
最快速的当然是基数排序。开一个10000000的数组,遍历你的数据,将对应下标+1最后按照这个数组输出一次,ok
解决方案九:
我觉得还是使用LinQ来排序比较合适
解决方案十:
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceConsoleApplication1{classProgram{staticvoidMain(string[]args){System.Diagnostics.Stopwatchwatch=newSystem.Diagnostics.Stopwatch();constintz=10000000;//随机生成一千万个数。int[]a=newint[z];Randomrandom=newRandom();for(inti=0;i<z;i++){a[i]=random.Next(0,z);}watch.Start();//计时器开始。a.OrderBy(n=>n);watch.Stop();stringtime=watch.ElapsedMilliseconds.ToString();Console.Write("Linq排序所用时间:"+""+time+"ms");Console.Write("rn");for(inti=0;i<z;i++){a[i]=random.Next(0,z);}watch=newSystem.Diagnostics.Stopwatch();watch.Start();Array.Sort(a);watch.Stop();//计时器结束。//for(inti=z-1000;i<z;i++)//{//Console.WriteLine(a[i]);//}time=watch.ElapsedMilliseconds.ToString();Console.Write("Array.Sort排序所用时间:"+""+time+"ms");Console.Write("rn");Console.ReadKey();}}}

Linq排序所用时间:1msArray.Sort排序所用时间:1461ms
解决方案十一:
引用1楼shingoscar的回复:

Array.Sort(a);

1楼正解。对于int型数组的排序算法不需要重写Sort方法。这个直接就能搞定。
解决方案十二:
再不行你也可以a.OrderBy(x=>x).toArray();降序是a.OrderByDistinct(x=>x).toArray();
解决方案十三:
引用9楼hegx2001的回复:

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceConsoleApplication1{classProgram{staticvoidMain(string[]args){System.Diagnostics.Stopwatchwatch=newSystem.Diagnostics.Stopwatch();constintz=10000000;//随机生成一千万个数。int[]a=newint[z];Randomrandom=newRandom();for(inti=0;i<z;i++){a[i]=random.Next(0,z);}watch.Start();//计时器开始。a.OrderBy(n=>n);watch.Stop();stringtime=watch.ElapsedMilliseconds.ToString();Console.Write("Linq排序所用时间:"+""+time+"ms");Console.Write("rn");for(inti=0;i<z;i++){a[i]=random.Next(0,z);}watch=newSystem.Diagnostics.Stopwatch();watch.Start();Array.Sort(a);watch.Stop();//计时器结束。//for(inti=z-1000;i<z;i++)//{//Console.WriteLine(a[i]);//}time=watch.ElapsedMilliseconds.ToString();Console.Write("Array.Sort排序所用时间:"+""+time+"ms");Console.Write("rn");Console.ReadKey();}}}

Linq排序所用时间:1msArray.Sort排序所用时间:1461ms

你这样计算时间就是有问题的好不,OrderBy只是建了个对象,根本就没排序,要比较应该这样写:watch.Start();vark=a.OrderBy(n=>n);foreach(varitemink){}watch.Stop();

解决方案十四:
random.Next(0,z);

这行代码意味着应该考虑计数排序。
解决方案十五:
试试System.Diagnostics.Stopwatchwatch=newSystem.Diagnostics.Stopwatch();constintz=10000000;//随机生成一千万个数。int[]a,b=newint[z];Randomrandom=newRandom();for(inti=0;i<z;i++){b[i]=random.Next(0,z);}do{Array.Copy(b,a=newint[z],z);watch.Restart();//计时器开始。QuickSort(a,0,z-1);watch.Stop();//计时器结束。//for(inti=z-1000;i<z;i++)//{//Console.WriteLine(a[i]);//}stringtime=watch.ElapsedMilliseconds.ToString();Console.Write("QuickSort排序所用时间:"+""+time+"ms");Console.Write("rn");Array.Copy(b,a=newint[z],z);watch.Restart();//计时器开始。Array.Sort(a);watch.Stop();//计时器结束。//for(inti=z-1000;i<z;i++)//{//Console.WriteLine(a[i]);//}time=watch.ElapsedMilliseconds.ToString();Console.Write("Array.Sort排序所用时间:"+""+time+"ms");Console.Write("rn");Array.Copy(b,a=newint[z],z);watch.Restart();int[]c=newint[z];foreach(intvina)++c[v];intai=0,n=0;foreach(intvinc){for(intj=Math.Min(ai+v,1000);ai!=j;a[ai++]=n);if(ai==1000)break;++n;}//计时器开始。watch.Stop();//计时器结束。//for(inti=z-1000;i<z;i++)//{//Console.WriteLine(a[i]);//}time=watch.ElapsedMilliseconds.ToString();Console.Write("计数排序所用时间:"+""+time+"ms");Console.Write("rn");Array.Copy(b,a=newint[z],z);watch.Restart();//计时器开始。fastCSharp.arrayExtension.sort(a);watch.Stop();//计时器结束。//for(inti=z-1000;i<z;i++)//{//Console.WriteLine(a[i]);//}time=watch.ElapsedMilliseconds.ToString();Console.Write("fastCSharp.arrayExtension.sort排序所用时间:"+""+time+"ms");Console.Write("rn");Array.Copy(b,a=newint[z],z);watch.Restart();//计时器开始。fastCSharp.arrayExtension.rangeSort(a,0,1000);watch.Stop();//计时器结束。//for(inti=z-1000;i<z;i++)//{//Console.WriteLine(a[i]);//}time=watch.ElapsedMilliseconds.ToString();Console.Write("fastCSharp.arrayExtension.rangeSort排序所用时间:"+""+time+"ms");Console.Write("rn");Array.Copy(b,a=newint[z],z);watch.Restart();//计时器开始。a=fastCSharp.algorithm.quickSort.getTop(a,1000).GetArray();//未对外开放watch.Stop();//计时器结束。//for(inti=z-1000;i<z;i++)//{//Console.WriteLine(a[i]);//}time=watch.ElapsedMilliseconds.ToString();Console.Write("fastCSharp_getTop排序所用时间:"+""+time+"ms");Console.Write("rn");Console.Write("rn");Console.ReadKey();}while(true);

QuickSort排序所用时间:1075msArray.Sort排序所用时间:1082ms计数排序所用时间:146msfastCSharp.arrayExtension.sort排序所用时间:161msfastCSharp.arrayExtension.rangeSort排序所用时间:89msfastCSharp_getTop排序所用时间:7msQuickSort排序所用时间:1053msArray.Sort排序所用时间:1068ms计数排序所用时间:145msfastCSharp.arrayExtension.sort排序所用时间:132msfastCSharp.arrayExtension.rangeSort排序所用时间:88msfastCSharp_getTop排序所用时间:6ms

解决方案:
试试这个
解决方案:
修改一下#14最后一个测试的代码a=fastCSharp.algorithm.quickSort.getTop(a,1000).GetArray();

这个仅仅是top1000,并没有对这1000个数排序,应该修改为a=fastCSharp.subArrayExtension.sort(fastCSharp.algorithm.quickSort.getTop(a,1000)).sort().GetArray();

不过测试时间没有差别,1000个数的排序相对与1000W个数的扫描根本不算什么。
解决方案:
已推荐………………
解决方案:
观摩观摩学生
解决方案:
该回复于2016-01-31 23:20:11被版主删除
解决方案:
进来支持了呢
解决方案:
用用多线程?
解决方案:
"此算法将1000万个中最大的1000数排序消耗时间是2000+ms",这个需求不需要将整个数组排序,使用最小堆,速度比这快得多。请参阅《寻找最大的K个数》http://blog.csdn.net/xiaoding133/article/details/8037086
解决方案:
楼主的代码存在严重的问题,在极端的条件下(对降序的数组做升序排序),程序处于假死状态,不知道什么时候会结束for(inti=0;i<z;i++){a[i]=z-i;}

应写解决好本身的算法,再去下结论
解决方案:
我觉得还是使用LinQ来排序比较合适
解决方案:
测试。。。。。
解决方案:
想起了一个视频挺魔性的...

时间: 2024-10-08 07:24:48

C#快速排序疑惑的相关文章

c++-类中某元素的快速排序

问题描述 类中某元素的快速排序 怎么改正可以再排列类中元素nodes[i].degree_num时排列i?我的程序只能排列degree_num 先开始试了第二幅图注解掉的绿色代码,出现了图一情况 我传递的数组 i 0 1 2 3 4 5 6 7 8 a[i] 10 9 8 7 6 5 4 3 2 a[i].degree_num 1 1 1 4 3 1 1 3 1 如何对快速排序改变一下使得能按照第三行重新排列数组内的值第二行 解决方案 a[i]是第2行 a[i].degree_num是第三行 手

新手学习c++,使用vs的疑惑

问题描述 新手学习c++,使用vs的疑惑 大家好,我是一名刚刚学习c++的新手,语法已经看得还可以了,使用vs2010写程序,但是我发现写出来的程序都是命令提示框,跟我之前使用的vb根本不同,不能直接做出界面,折腾了好久,后来发现vs中有一个工具箱,貌似可以使用控件设计界面,但是又发现这好像是c#的代码,而且看了一下,好像都是用类处理的,作为c++新手的我就蒙掉了. 我就想问是不是学习c++,使用vs就只能是利用mfc做界面,或者是直接调用api制作界面呢?而呢个工具箱好像就是为c#设计而已啊?

double类型结构体对齐的疑惑

问题描述 double类型结构体对齐的疑惑 32bit的cpu,在msvc中如果结构体有double类型,则以8字节对齐,例如 struct test { char ch; double j; }; ch也会占用8个字节,而32bit的cpu会一次性取到8个字节么?难道不是32bit,4个字节? 为什么要以8个字节来对齐呢?谢谢 解决方案 如果编译器为sse优化,那么是按照128bit,也就是8字节对齐的,如果编译器为sse2优化,那么是按照16字节对齐的.http://www.xuebuyua

个人疑惑之——机器学习

问题描述 个人疑惑之--机器学习 本科生适合搞机器学习么?能做到什么样的程度呢?个人觉得数学太不够了,或者有大神带带小弟么?

ie兼容-关于IE条件语句的一点疑惑

问题描述 关于IE条件语句的一点疑惑 经常在网站头部看到类似于这样的IE条件注释: <!--[if IE 7 ]><html lang=""zh"" id=""ne_wrap"" class=""no-js ie7""><![endif]--> 虽然能够理解该注释语法:在浏览器版本为ie7时,应用该代码,非ie浏览器则只把其当做一条注释而忽略掉.但不太

c++-C++快速排序的程序填空!求大神

问题描述 C++快速排序的程序填空!求大神 5C 感觉跟书上的程序有点不太一样,求大神帮忙! 解决方案 1.vp判断是否大于sp2.判断vp是否小于ep3.temp = ip的值4.jp-->sp5.break6.ip的值 = jp的值,jp的值=temp:7.3和6的组合(交换值)第四部判定条件需要你在测试一下 解决方案二: 每天回帖即可获得10分可用分

JS实现随机化快速排序的实例代码

这篇文章介绍了JS实现随机化快速排序的实例代码,有需要的朋友可以参考一下   算法的平均时间复杂度为O(nlogn).但是当输入是已经排序的数组或几乎排好序的输入,时间复杂度却为O(n^2).为解决这一问题并保证平均时间复 杂度为O(nlogn)的方法是引入预处理步骤,它惟一的目的是改变元素的顺序使之随机排序.这种预处理步骤可在O(n)时间内运行.能够起到同样作用的 另一种简单方法是在算法中引入一个随机元素,这可以通过随机地选择拆分元素的主元来实现.随机选择主元的结果放宽了关于输入元素的所有排列

PHP7 RC7 Release对比PHP5.6快速排序20000数据性能体验以及新语法尝鲜

最近Zend的PHP7已经 处于最后的BUG修复阶段,目前 已经更新RC7,对于Zend官方的说法PHP7的性能大约相比PHP5系列版本 提高2倍以上,增加了一些新的语法,摒弃了PHP5的一些影响性能的因素,主要增加了以下Features . Improved performance: PHP 7 is up to twice as fast as PHP 5.6 性能比5.6提高2倍 Consistent 64-bit support 64位一致性支持Many fatal errors are

JS异步传递数组Action接受的实现与疑惑

最近开发中遇到了页面传递数组到Action后台List类型,接受到的list对象并不是想象的按照数组元素位置对应的接受,例如数组的0位置插入到list对象的0位置, 而是数组的全部内容全部插入到了list集合的第一位置.经过反复的试验,没有找到很好的解决办法,只能把这种粗糙的实现方式记录下来,以求抛砖引玉望大家能给出更好的实现方式. 这是jsp页面代码:异步提交数组到Action中: <html> <head> <meta http-equiv="Content-T