当前位置: 首页 > 后端技术 > PHP

程序员修仙之道--算法快排有多快

时间:2023-03-30 02:35:59 PHP

分而治之的思想关于排序,世界上有一种分而治之的思想,可以大大提高排序方法的性能,所谓分而治之就是:把big变成thesmall,divideandconquer.以达到治小治大的效果多年来,基于分而治之的思想衍生出多种排序方法,但都一样!虽然有世界上的算法很多,好的算法小编认为必须满足以下几个条件,才能真正提高从业者的实力。比较和交换。其他不交换元素的算法将主要比较是数组访问次数的维度。其实有很多做法作者对算法的时间复杂度有点模糊,分不清所谓的O(n)、O(nlogn)、O(logn)...等到底是什么,也许下图对某些人有一些更直观的理解。空间复杂度(额外内存占用)排序算法的额外内存开销与运行时间同等重要。即使一个算法,时间复杂度很好,空间复杂度很差,额外占用内存很多,菜菜也觉得不是好算法。优秀的算法。结果正确性的指标是菜菜自己加的。我一直认为一个优秀的算法最终的结果一定是正确的。就算一个算法的时空复杂度极好,结果也不正确,让修行者经脉倒转、痴迷,又有什么意义呢?原理的基本思想:选取一个元素作为分割点,通过遍历,将小于分割点的元素放在分割点的左边,大于分割点的元素放在分割点的左边分割点。在拆分点元素的右侧。然后将两部分数据分别按照这个方法排序,依次类推,直到拆分数组的大小为1。整个排序过程可以递归进行,这样整个数据就变成了一个有序的序列。过程快排序的方式有很多种,其中指针移动是最常见的,为什么最常见呢?因为它的空间复杂度是O(1),也就是说是原地排序。我们从待排序的记录序列中选择一个记录(通常是第一个)作为引用元素(称为key)key=arr[left],然后设置两个变量,left指向数组最左边的部分,和right指向数据的最右边部分。key先和arr[right]比较,如果arr[right]key那么我们只在right之后--,right--,比较arr[right]和key直到arr[right]key,则Setarr[right]=arr[left],如果arr[left]data=newList();for(inti=0;i<11;i++){data.Add(newRandom(Guid.NewGuid().GetHashCode()).Next(1,100));}//打印原始数组值Console.WriteLine($"原始数据:{string.Join(",",data)}");快速排序(数据,0,数据。计数-1);//打印排序后的数组Console.WriteLine($"Sortdata:{string.Join(",",data)}");控制台.Read();}publicstaticvoidquickSort(Listsource,intleft,intright){intpivot=0;如果(左<右){pivot=分区(源,左,右);快速排序(源,左,枢轴-1);quickSort(来源,枢轴+1,右);}}//按照第一个元素对数组/列表进行排序,排序后返回key的位置索引privatestaticintpartition(List=key){right--;}来源[左]=来源[右];while(left=key{right--}source[left]=source[right]forleft