c#实现最简洁的快速排序(你绝对可以看懂)

作者:colorfulCat 时间:2022-04-01 22:35:48 

前言

算法对于程序员的重要性不言而喻,今天我和大家分享算法中的一个基础算法,快速排序。作为一名程序员,相信大家都不陌生,但是要大家徒手一次性写出来,我估计还是有难度的。那么废话不多少,我先简单减少一下概念。

快速排序算法说明:

原始数组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现在这么火,代码真的简单。但是最为程序员,我们始终要记住,语言只是工具,我们才是语言的主宰。了解代码背后的思想才是王道!

来源:https://www.cnblogs.com/pettyColorcat/p/10861302.html

标签:c#,排序,算法
0
投稿

猜你喜欢

  • Java 合并多个MP4视频文件

    2022-08-23 12:09:19
  • 浅谈log4j的rootLogger及其他坑爹的地方

    2023-07-31 02:23:14
  • 浅谈java多态的实现主要体现在哪些方面

    2023-08-17 07:41:32
  • Android-实现切换Fragment页功能的实现代码

    2023-05-06 12:28:49
  • Java 比较接口comparable与comparator区别解析

    2022-11-26 20:54:24
  • 深入理解Java设计模式之简单工厂模式

    2023-12-06 07:16:36
  • Java Mybatis批量修改封装详解

    2021-12-29 22:41:52
  • 9个非常棒的Android代码编辑器 移动开发者的最爱

    2021-11-08 07:04:06
  • java环境变量path和classpath的配置

    2023-08-31 01:09:04
  • android跑马灯出现重复跳动以及不滚动问题的解决方法

    2023-07-24 00:33:48
  • C#实现chart控件动态曲线绘制

    2022-01-22 19:10:11
  • 深入理解MyBatis中的一级缓存与二级缓存

    2022-05-25 09:41:34
  • 深入浅析c#静态多态性与动态多态性

    2022-10-16 09:41:17
  • Android中TelephonyManager类的用法案例详解

    2022-04-30 20:18:32
  • SpringBoot在RequestBody中使用枚举参数案例详解

    2022-12-15 05:16:30
  • Android GestureDetector手势滑动使用实例讲解

    2022-01-18 01:34:12
  • Java String、StringBuffer与StringBuilder的区别

    2022-08-29 23:29:55
  • mybatis plus使用redis作为二级缓存的方法

    2023-11-19 08:34:58
  • 解决Android studio 2.3升级到Android studio 3.0 后apt报错问题

    2023-05-17 13:56:50
  • Java GZIP压缩与解压缩代码实例

    2023-11-20 15:57:17
  • asp之家 软件编程 m.aspxhome.com