c#实现最简洁的快速排序(你绝对可以看懂)
前言
算法对于程序员的重要性不言而喻,今天我和大家分享算法中的一个基础算法,快速排序。作为一名程序员,相信大家都不陌生,但是要大家徒手一次性写出来,我估计还是有难度的。那么废话不多少,我先简单减少一下概念。
快速排序算法说明:
原始数组l1,从中任意选择一个基准数f(一般选择第1个),小于f的数据放在f的左边记为数组minlist,大于f的数据放在f的右边记为数组maxlist。那么
l1=minlist+f+maxlist
然后对minlist和maxlist再做这样的操作,直到minlist和maxlist中的元素个数为1或者0的时候停止
一、c#网上目前最简洁的实现方式:
现在就是要进行算法的实现了,很明显,这里要用到一个叫递归的思想。我们知道编程语言知识工具,算法才是核心,但是不同的编程语言实现算法却有很大的不同(简洁程度)。目前网上对于c#的实现快速排序的方式有很多,简单查阅了一下,发现一般都要100行代码左右(c和c++的代码行数要少一些)。千找万找,终于找到了一个,贴出如下:
static void quicksort(ref list<int> nums, int left, int right) { if (left < right) { int i = left; int j = right; int middle = nums[(left + right) / 2]; while (true) { while (i < right && nums[i] < middle) { i++; }; while (j > 0 && nums[j] > middle) { j--; }; if (i == j) break; int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; if (nums[i] == nums[j]) j--; } quicksort(ref nums, left, i); quicksort(ref nums, i + 1, right); } }
但是说真的,很难读懂,真要在考场上写出这个代码,难保能一次写对。
二、python的实现方式:
python我也有接触,所以当我用python写出这个算法的代码的时候,真的有种感觉,真是太tm简单了吧,有编程经验的同学应该也能看懂下面的python代码
def quicksort(array): if len(array) < 2: return array ------基线条件:为空或只包含一个元素的数组是“有序”的 else: pivot = array[0] ------递归条件 less = [i for i in array[1:] if i <= pivot] ------由所有小于基准值的元素组成的子数组 greater = [i for i in array[1:] if i > pivot] ------由所有大于基准值的元素组成的子数组 return quicksort(less) + [pivot] + quicksort(greater) print quicksort([10, 5, 2, 3])
短短几行代码,清晰明了。主要的代码就是数组可以直接相加运算:quicksort(less) + [pivot] + quicksort(greater)
三、c#自己实现最简易方式
那难道我们c#就只能写出难懂又多的代码才能实现吗?终于让我也找到了,下面贴出我自己写的c#代码:
public class extend :list<int> { public static extend operator +(extend l1, extend l2) { l1.addrange(l2); return l1; } } static extend quicksort2(extend nums) { if (nums.count < 2) { return nums; } else { extend minlist = new extend();//小于基准数的集合 extend maxlist = new extend();//大于基准数的集合 int f = nums[0]; for (int i = 1; i < nums.count; i++) { if (nums[i] <= f) minlist.add(nums[i]); else maxlist.add(nums[i]); } return quicksort2(minlist) + new extend() { f} + quicksort2(maxlist);//递归,并且使用+运算符 } }
实际上就只有两步操作,就实现了和python一样的简洁!
第一:新建一个extend 类继承于list<int>
第二:重写了+运算符
有同学对extend类中的addrange方法提出了内存上的质疑,我也进行了回复,算法是对时间复杂度的考察,也就是对过程的考察。内存消耗根据不同的代码肯定会有所不同,但是不影响算法。当然我也对extend进行了改进,因为实际上最终的加法运算中,minlist和maxlist都只有一个元素,或者没有元素。
public class extend :list<int> { private static extend k = new extend(); public static extend operator +(extend l1, extend l2) { if (l1.count == 1) k.add(l1[0]); if (l2.count == 1) k.add(l2[0]); return k; //l1.addrange(l2); //return l1; } }
其余的和python的代码基本一致,代码清晰明了。
据我观察,c#通过我这种方式实现的,目前独此一份,收好不谢!最后我还是要吐槽一句,怪不得python现在这么火,代码真的简单。但是最为程序员,我们始终要记住,语言只是工具,我们才是语言的主宰。了解代码背后的思想才是王道!
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
上一篇: Python探索之自定义实现线程池
下一篇: C#8.0 中开启默认接口实现方法