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) / ];
while (true)
{
while (i < right && nums[i] < middle) { i++; };
while (j > && 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 + , 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 < )
{
return nums;
}
else
{
Extend minList = new Extend();//小于基准数的集合
Extend maxList = new Extend();//大于基准数的集合
int f = nums[];
for (int i = ; 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 == ) k.Add(L1[]);
if (L2.Count == ) k.Add(L2[]);
return k;
//L1.AddRange(L2);
//return L1;
}
}
其余的和python的代码基本一致,代码清晰明了。
据我观察,c#通过我这种方式实现的,目前独此一份,收好不谢!最后我还是要吐槽一句,怪不得python现在这么火,代码真的简单。但是最为程序员,我们始终要记住,语言只是工具,我们才是语言的主宰。了解代码背后的思想才是王道!
c#实现最简快速排序,你绝对可以看懂的更多相关文章
- 超详细 Nginx 极简教程,傻瓜一看也会!
什么是Nginx? Nginx (engine x) 是一款轻量级的Web 服务器 .反向代理服务器及电子邮件(IMAP/POP3)代理服务器. 什么是反向代理? 反向代理(Reverse Proxy ...
- 【公众号转载】超详细 Nginx 极简教程,傻瓜一看也会!
什么是Nginx? Nginx (engine x) 是一款轻量级的Web 服务器 .反向代理服务器及电子邮件(IMAP/POP3)代理服务器. 什么是反向代理? 反向代理(Reverse Proxy ...
- C基础 内存越界和内存监测的简单处理
引言 突然感觉要出去走走了, 醒了后 刷完牙就在联系coding, 不知不觉到了 黄昏. 看看天, 打开灯. 又感觉到了 夜夜夜夜 . 13年到北京务工, 遇到一批批NB的同龄人物. 一块工作, 一块 ...
- php排序之快速排序
关于快速排序的介绍 请看百度百科讲解的很详细 http://baike.baidu.com/link?url=1VOpp4qjdwKma81MFPozjvyPy2rYJos6ZmfP5Ady3xjEP ...
- 基础排序算法之快速排序(Quick Sort)
快速排序(Quick Sort)同样是使用了分治法的思想,相比于其他的排序方法,它所用到的空间更少,因为其可以实现原地排序.同时如果随机选取中心枢(pivot),它也是一个随机算法.最重要的是,快速排 ...
- Java DualPivotQuickSort 双轴快速排序 源码 笔记
DualPivotQuicksort source code 这个算法是Arrays.java中给基本类型的数据排序使用的具体实现.它针对每种基本类型都做了实现,实现的方式有稍微的差异,但是思路都是相 ...
- Objective-C基础之简析深浅copy
一.从面向对象到Objective-C概览copy 1.面向对象: In object-oriented programming, object copying is creating a copy ...
- .NET Core实战项目之CMS 第八章 设计篇-内容管理极简设计全过程
写在前面 上一篇文章中我带着大家进行了权限部分的极简设计,也仅仅是一个基本的权限设计.不过你完全可以基于这套权限系统设计你的更复杂的权限系统,当然更复杂的权限系统要根据你的业务来进行,因为任何脱离实际 ...
- Python 冒泡排序、归并排序、快速排序
冒泡排序 原理: 代码: def bubble_sort2(arr):for j in range(len(arr) - 1, 0, -1): # [n-1, n-2, ....2, 1]for i ...
随机推荐
- python自动化运维六:paramiko
paramiko是基于python实现的SSH2远程安全连接,支持认证以及密钥方式,可以实现远程命令执行,文件传输,中间SSH代理等功能.也就是采用SSH的方式进行远程访问.SSH登陆的方式可以参考之 ...
- Ceph集群rbd-mirror A、B区域备份实施方案
Ceph集群rbd-mirror A.B区域备份实施方案 备注:首先准备两个集群, 并确认其状态,集群的准备过程在这就不做陈述 1.查看集群状态 A区域 [root@ceph2111 ceph]# c ...
- 《Python Machine Learning》索引
目录部分: 第一章:赋予计算机从数据中学习的能力 第二章:训练简单的机器学习算法——分类 第三章:使用sklearn训练机器学习分类器 第四章:建立好的训练集——数据预处理 第五章:通过降维压缩数据 ...
- 《程序员代码面试指南》第八章 数组和矩阵问题 打印N 个数组整体最大的Top K
题目 打印N 个数组整体最大的Top K java代码 package com.lizhouwei.chapter8; /** * @Description: 打印N 个数组整体最大的Top K * ...
- 使用wepy 小程序授权点击取消授权失败的方案
在wepy里使用进行小程序页面授权,里面包含了用户点击取消的重新授权方案: //auth.js /* * @Author: Porco_Mar * @Date: 2018-04-11 15:49:55 ...
- 在高通平台Android环境下编译内核模块【转】
本文转载自:http://blog.xeonxu.info/blog/2012/12/04/zai-gao-tong-ping-tai-androidhuan-jing-xia-bian-yi-nei ...
- Cocos2d-x中判断点击是否在触摸屏区域
新建2dx工程. 在HelloWorld头文件加入以下语句: virtual void registerWithTouchDispatcher();//注册触屏事件 覆写register方法 virt ...
- redis持久化【转】
Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计算集合的并,交和补集(diff ...
- JS事件派发器EventEmitter
原文地址:http://zhangyiheng.com/blog/articles/js_event_mitter.html 需求 随着Browser客户端JS越来越复杂,MVC(Client端)设计 ...
- linux 网络编程getdomainname与gethostname函数
getdomainname与gethostname函数 1 gethostname() : 返回本地主机的标准主机名. 原型如下: #include <unistd.h> int geth ...