c#实现最简洁的快速排序(你绝对可以看懂)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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现在这么⽕,代码真的简单。
但是最为程序员,我们始终要记住,语⾔只是⼯具,我们才是语⾔的主宰。
了解代码背后的思想才是王道!
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。