算法系列15天速成——第一天 七大经典排序【上】。算法就好比程序开发中的利剑,所到之处,刀起头落。
针对现实中的排序问题,算法有七把利剑可以助你马道成功。
[csharp]
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Text;
- usingSystem.Threading;
- usingSystem.Diagnostics;
-
- namespaceQuickSort
- {
- publicclassProgram
- {
- staticvoidMain(string[]args)
- {
- //5次比较
- for(inti=1;i<=5;i++)
- {
- Listlist=newList();
-
- //插入200个随机数到数组中
- for(intj=0;j<200;j++)
- {
- Thread.Sleep(1);
- list.Add(newRandom((int)DateTime.Now.Ticks).Next(0,10000));
- }
-
- Console.WriteLine("\n第"+i+"次比较:");
-
- Stopwatchwatch=newStopwatch();
-
- watch.Start();
- varresult=list.OrderBy(single=>single).ToList();
- watch.Stop();
-
- Console.WriteLine("\n系统定义的快速排序耗费时间:"+watch.ElapsedMilliseconds);
- Console.WriteLine("输出前是十个数:"+string.Join(",",result.Take(10).ToList()));
-
- watch.Start();
- newQuickSortClass().QuickSort(list,0,list.Count-1);
- watch.Stop();
-
- Console.WriteLine("\n俺自己写的快速排序耗费时间:"+watch.ElapsedMilliseconds);
- Console.WriteLine("输出前是十个数:"+string.Join(",",list.Take(10).ToList()));
-
- }
- }
- }
-
- publicclassQuickSortClass
- {
-
- ///
- ///分割函数
- ///
- ///待排序的数组
- ///数组的左下标
- ///
- ///
- publicintDivision(Listlist,intleft,intright)
- {
- //首先挑选一个基准元素
- intbaseNum=list[left];
-
- while(left<>
- {
- //从数组的右端开始向前找,一直找到比base小的数字为止(包括base同等数)
- while(left=baseNum)
- right=right-1;
-
- //最终找到了比baseNum小的元素,要做的事情就是此元素放到base的位置
- list[left]=list[right];
-
- //从数组的左端开始向后找,一直找到比base大的数字为止(包括base同等数)
- while(left<>
- left=left+1;
-
-
- //最终找到了比baseNum大的元素,要做的事情就是将此元素放到最后的位置
- list[right]=list[left];
- }
- //最后就是把baseNum放到该left的位置
- list[left]=baseNum;
-
- //最终,我们发现left位置的左侧数值部分比left小,left位置右侧数值比left大
- //至此,我们完成了第一篇排序
- returnleft;
- }
-
- publicvoidQuickSort(Listlist,intleft,intright)
- {
- //左下标一定小于右下标,否则就超越了
- if(left<>
- {
- //对数组进行分割,取出下次分割的基准标号
- inti=Division(list,left,right);
-
- //对“基准标号“左侧的一组数值进行递归的切割,以至于将这些数值完整的排序
- QuickSort(list,left,i-1);
-
- //对“基准标号“右侧的一组数值进行递归的切割,以至于将这些数值完整的排序
- QuickSort(list,i+1,right);
- }
- }
- }
- }
不错,快排就是快,难怪内库非要用他来作为排序的标准。
嗯,最后要分享下:
冒泡的时间复杂度为: 0(n) - 0(n^2)
快排的时间复杂度为:
平均复杂度: N(logN)
最坏复杂度: 0(n^2)