/// <summary>
/// 快速排序中的切分
/// lIndex已经是基准值,i记录基准值的大小值的边界,j记录目前遍历的边界;
/// i值必须从lIndex+1开始,因为基准值已经在lIndex位置了,
/// i位置的值必须大于基准值,因为发现比基准值小的值,需要和i位置的值交换,
/// 交换结束后,i++,变更基准边界值;
/// 最后,交换基准值和i-1位置的值,基准值归位,i-1位置是基准值的大小值边界,
/// 返回i-1
/// </summary>
/// <param name="values"></param>
/// <param name="lIndex"></param>
/// <param name="rIndex"></param>
/// <returns></returns>
public static int Partition(int[] values,int lIndex,int rIndex)
{
int p = values[lIndex];
int i = lIndex+1;
for(int j = lIndex + 1; j <= rIndex; j++)
{
if (values[j] < p)
{
int temp = values[i];
values[i] = values[j];
values[j] = temp;
i++;
}
}
int tempp = values[lIndex];
values[lIndex] = values[i - 1];
values[i - 1] = tempp;
return i - 1;
} public static void QuickSort(int[] values,int lIndex,int rIndex)
{
if (lIndex >= rIndex)
{
return;
}
int index = ChoosePivot(values, lIndex, rIndex);
int temp = values[index];
values[index] = values[lIndex];
values[lIndex] = temp;
int j = Partition(values, lIndex, rIndex);
QuickSort(values, lIndex, j - 1);
QuickSort(values, j + 1, rIndex);
}
public static int ChoosePivot(int[] values,int lIndex,int rIndex)
{
Random rand = new Random();
int index = rand.Next(lIndex, rIndex);
return lIndex;
}
int[] values = new int[100000];
Random rand = new Random();
for(int i = 0; i < values.Length; i++)
{
values[i] = rand.Next(0, values.Length);
}
int[] valuesCopy = (int[])values.Clone();
bool ifEqual = true;
for(int i = 0; i < values.Length; i++)
{
if(values[i] != valuesCopy[i])
{
ifEqual = false;
}
}
Console.WriteLine($"排序前:ifEqual->{ifEqual}");
Stopwatch sw = new Stopwatch();
sw.Start();
AlgorithmMethod.QuickSort(values, 0, values.Length - 1);
sw.Stop();
Console.WriteLine($"QuickSort用时:{sw.ElapsedMilliseconds}ms");
sw.Restart();
var a = valuesCopy.ToList();
a.Sort();
valuesCopy = a.ToArray();
sw.Stop();
Console.WriteLine($"Order用时:{sw.ElapsedMilliseconds}ms");
ifEqual = true;
for (int i = 0; i < values.Length; i++)
{
if (values[i] != valuesCopy[i])
{
ifEqual = false;
}
}
Console.WriteLine($"排序后:ifEqual->{ifEqual}");
排序前:ifEqual->True
QuickSort用时:46ms
Order用时:5ms
排序后:ifEqual->True

QuickSort之C#实现的更多相关文章

  1. quickSort算法导论版实现

    本文主要实践一下算法导论上的快排算法,活动活动. 伪代码图来源于 http://www.cnblogs.com/dongkuo/p/4827281.html // imp the quicksort ...

  2. Javascript算法系列之快速排序(Quicksort)

    原文出自: http://www.nczonline.net/blog/2012/11/27/computer-science-in-javascript-quicksort/ https://gis ...

  3. JavaScript 快速排序(Quicksort)

    "快速排序"的思想很简单,整个排序过程只需要三步: (1)在数据集之中,选择一个元素作为"基准"(pivot). (2)所有小于"基准"的元 ...

  4. QuickSort 快速排序 基于伪代码实现

    本文原创,转载请注明地址 http://www.cnblogs.com/baokang/p/4737492.html 伪代码 quicksort(A, lo, hi) if lo < hi p ...

  5. quicksort

    快排.... void quicksort(int *a,int left,int right){ if(left >= right){ return ; } int i = left; int ...

  6. 随手编程---快速排序(QuickSort)-Java实现

    背景 快速排序,是在上世纪60年代,由美国人东尼·霍尔提出的一种排序方法.这种排序方式,在当时已经是非常快的一种排序了.因此在命名上,才将之称为"快速排序".这个算法是二十世纪的七 ...

  7. 算法实例-C#-快速排序-QuickSort

    算法实例 ##排序算法Sort## ### 快速排序QuickSort ### bing搜索结果 http://www.bing.com/knows/search?q=%E5%BF%AB%E9%80% ...

  8. python Quicksort demo

    __author__ = 'student' ''' quicksort step 1, choose one pivot, such as pivot=la[0] step 2, scan the ...

  9. 63.如何对单链表进行快排?和数组快排的分析与对比[quicksort of array and linked list]

    [本文链接] http://www.cnblogs.com/hellogiser/p/quick-sort-of-array-and-linked-list.html [题目] 单链表的特点是:单向. ...

  10. 这个代码怎么改??Help快速排序 quicksort

    #include<stdio.h>int a[101],n;void quicksort(int left,int right){     int i,j,t,temp;     if(l ...

随机推荐

  1. Ansible - [01] 入门&安装部署

    自动化运维工具,可以批量远程其他主机并进行管理操作 一.什么是 Ansible Ansible首次发布于2012年,作者:Michael DeHaan,同时也是Cobbler的作者,Ansible于2 ...

  2. 【BUUCTF】Ping Ping Ping

    [BUUCTF]Ping Ping Ping (命令执行绕过总结) 题目来源 收录于:BUUCTF GXYCTF2019 题目描述 提示较为明确,get方法传参127.0.0.1后结果如下 比较容易想 ...

  3. 使用selenium下载文件--设置下载文件自动保存文件夹

    selenium自动下载文件到指定目录 本文参考:https://www.cnblogs.com/huxiaofeng1029/p/17383726.html 有时候,我们需要在网页中点击某些按钮,将 ...

  4. Java Properties配置文件和XML配置文件读取

    一.properties类读取配置文件 1.从项目中读取properties配置文件,新建一个main程序,对应位置建立一个名称为config.properties配置文件,随意放置一些键值对.IDE ...

  5. js回忆录(1) -- 变量,null 和 undefined

    变量:这个东西不同的高度的人看法不一样,甚至不同领域的人的看法也不一样,当初上机组的时候依稀记得老师说这个寄存器那个锁存器什么的,然后根据高低电位就变成了二进制认识的0和1了,当然了具体细节本博主大人 ...

  6. Golang 入门 : 符文

    字符串常用语表示一系列文本字符,而Go的符文(rune)则用于表示单个字符. 字符串字面量由双引号(")包围,但rune字面量由单引号(')包围. Go程序几乎可以使用地球上任何语言的任何字 ...

  7. 原生 JS 实现 HTML 转 Markdown ,(html2md.js 或 html2markdown.js)

    之前因为一些需要,需要转换部分 HTML 标签成 markdown 格式,但是不知不觉就完善到一个相对完整的函数. 然后我就封装成了一个文件放在了 github ( https://github.co ...

  8. nodejs参数的处理与用户的交互

    解析脚本参数 作为脚本或者命令行工具,一般都需要支持不同的用户参数.默认参数被保存在process.argv的数组中,如下: [ nodeBinary, script, arg0, arg1, ... ...

  9. openGL库环境简单配置

    主要是针对openGL的一些初步的学习,因为openCV主要是处理图像视频,是从现有的得到数据,而openGL好像是从数据进行绘图,学习一下.在<计算机图形学编程>一书中,它把图形编程定性 ...

  10. linux服务器运行java项目, 监控查看内存、储存空间和cpu占用率

    服务器部署方式为tomcat中运行war包的方式, 有一次重新部署时候发现报异常堆栈溢出了. 想要定位到某个war包中通过学习整理出此篇文章以作记录笔记. 关于远程调试, 可以本地对线上代码debug ...