C#实现快速排序
网上很多关于快速排序的教程,嗯,不错,版本也很多,有的试了一下还报错。。呵呵
于是乎低智商的朕花了好几天废了8张草稿纸才弄明白。。
快速排序的采用的分治啊挖坑填数啊之类的网上到处都是,具体过程自己百度吧,这里就讲讲我自己写的代码。还有,快排是一种不稳定的排序算法,就是说,当整个数列是无序状态时,效率高,但是,当把一个从大到小的通过排序转成从小到大的,那就呵呵了,随时StackOverflow。。
OK,先上代码(排序结果是从小到大)
static void QuickSort(int[] num, int left, int right)
{
if (left >= right)
return; int key = num[left];
int i = left;
int j = right; while (i < j)
{
while (i < j && key < num[j])
j--;
if (i >= j)
{
num[i] = key;
break;
}
num[i] = num[j]; while (i < j && key >= num[i])
i++;
if (i >= j)
{
num[i] = key;
break;
}
num[j] = num[i];
}
num[i] = key; QuickSort(num, left, i - );
QuickSort(num, i + , right);
}
参数中的num就不用说了吧,left和right分别代表排序待排序数组的开始和结尾的索引,当然默认排序整个数组的话就:
QuickSort(a, , a.Length - );
假设待排序数组是a,排序索引是0到最后一项的元素。
快排使用分治,选取一个关键值key(代码中的第6行,并且默认使用待排序数组的第一个值),把比它大的和比它小的分别放在两边。
具体就是先从数组右边(j值记录的索引)开始找比key小的数,对应代码的12、13行,至于为什么要i < j,呵呵,待会儿说。
循12行环的意义是,如果当前num[j]比key大,j就自减,直到key>num[j]就找到了比key小或相等的数了呗。
又由于排序的数千变万化,所以有的情况下j一路减下去或记录左边索引的i一路加上去,就有可能i>=j,于是就有了10、12、14、21、23行判断i和j关系的语句了,因为如果i都>=j了,就表示分完了啊。
于是先假设i一直<j,通过12行的循环找到了比key小或等于的值,就把左右的数交换,不用担心key不见,因为有第6行。。
之后又通过21行的循环找比key大的值,再在28行交换。这样下来10行的大循环完了之后,数组就留了一个“空位”(这个“空位”当然有数,只是它应该被key填充),再在30行用key填充。
之后31、32行递归(别说你不知道啥意思),再对key两边的数进行排序。
排序完成后,i值就对应key的索引,所以递归调用的参数就那样填。。
以上纯属个人理解,有错误的地方还请指出!
C#实现快速排序的更多相关文章
- [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序
用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html 目录 马桶排序(令人 ...
- 算法与数据结构(十六) 快速排序(Swift 3.0版)
上篇博客我们主要聊了比较高效的归并排序算法,本篇博客我们就来介绍另一种高效的排序算法:快速排序.快速排序的思想与归并排序类似,都是采用分而治之的方式进行排序的.快速排序的思想主要是取出无序序列中第一个 ...
- [算法]——快速排序(Quick Sort)
顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...
- 排序算法----调用库函数qsort进行快速排序
功 能: 快速排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const ...
- Html5 快速排序演示
快速排序(Quicksort)是对冒泡排序的一种改进.快速排序由C. A. R. Hoare在1962年提出. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另 ...
- Java 快速排序两种实现
快速排序,只要学习过编程的人肯定都听说过这个名词,但是有时候写的时候还真蒙住了,网上搜罗了下以及查阅了"introduction to algorithm",暂时找到两种实现快排的 ...
- java基础算法之快速排序
快速排序(Quicksort)是对冒泡排序的一种改进.在大学学过之后现在基本忘了,最近在好多地方都看到说快速排序在面试会问到,于是自己也准备重新拾起以前忘记的东西来,慢慢的积累自己的基础知识.figh ...
- PAT 1045. 快速排序(25)
著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的N个互不相同的正整数的排列,请问有多 ...
- 快速排序中的partition函数的枢纽元选择,代码细节,以及其标准实现
很多笔试面试都喜欢考察快排,叫你手写一个也不是啥事.我很早之前就学了这个,对快速排序的过程是很清楚的.但是最近自己尝试手写,发现之前对算法的细节把握不够精准,很多地方甚至只是大脑中的一个映像,而没有理 ...
- php冒泡排序和快速排序
如有错误,请指出... //快速排序(array_merge整合数组)function quick_sort($arr){ $num=count($arr); if($num<=1){ retu ...
随机推荐
- 20145222《信息安全系统设计基础》Linux常用命令汇总
学习Linux时常用命令汇总 通过Ctrl+f键可在该网页搜索到你想要的命令. Linux中命令格式为:command [options] [arguments] //中括号代表是可选的,即有些命令不 ...
- [开源].NET高性能框架Chloe.ORM-完美支持.NET Core
扯淡 这是一款轻量.高效的.NET C#数据库访问框架(ORM).查询接口借鉴 Linq(但不支持 Linq).借助 lambda 表达式,可以完全用面向对象的方式就能轻松执行多表连接查询.分组查询. ...
- ios应用程序结构
MVC开发模式 什么是mvc,相信有一定开发经验的程序员都应该知道. M —— 模型,为程序提供数据 V —— 视图,为用户提供界面 C —— 控制器,用来控制程序视图,即上面的V 在ios程序中,一 ...
- java的反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制. ...
- static实现单例的隐患
1. 前言 Java的单例有多种实现方式:单线程下的简单版本.无法在指令重排序下正常工作的Double-Check.static.内部类+static.枚举--.这篇文章要讨论的,是在使用static ...
- OBS-Studio二次开发记录
OBS-Studio 是一款跨平台的,开源的视频直播客户端软件. 公司需要对他进行二次开发,开发的目的是使用它的录屏功能. 开发的要求是:定制全新的界面,所见即所得,window系统兼容要好. 开发步 ...
- Puzzle 面向服务/切面(AOP/IOC)开发框架 For .Net
Puzzle 面向服务/切面AOP开发框架 For .Net AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效 ...
- Javascript数组操作(转)
1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限, ...
- Python批量扫描服务器指定端口状态
闲来无事用Python写了一个简陋的端口扫描脚本,其简单的逻辑如下: 1. python DetectHostPort.py iplist.txt(存放着需要扫描的IP地址列表的文本,每行一个地址) ...
- SAM初探
SAM,即Suffix Automaton,后缀自动机. 关于字符串有很多玩法,有很多算法都是围绕字符串展开的.为什么?我的理解是:相较于数字组成的序列,字母组成的序列中每个单位上元素的个数是有限的. ...