QuickSort之C#实现
/// <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#实现的更多相关文章
- quickSort算法导论版实现
本文主要实践一下算法导论上的快排算法,活动活动. 伪代码图来源于 http://www.cnblogs.com/dongkuo/p/4827281.html // imp the quicksort ...
- Javascript算法系列之快速排序(Quicksort)
原文出自: http://www.nczonline.net/blog/2012/11/27/computer-science-in-javascript-quicksort/ https://gis ...
- JavaScript 快速排序(Quicksort)
"快速排序"的思想很简单,整个排序过程只需要三步: (1)在数据集之中,选择一个元素作为"基准"(pivot). (2)所有小于"基准"的元 ...
- QuickSort 快速排序 基于伪代码实现
本文原创,转载请注明地址 http://www.cnblogs.com/baokang/p/4737492.html 伪代码 quicksort(A, lo, hi) if lo < hi p ...
- quicksort
快排.... void quicksort(int *a,int left,int right){ if(left >= right){ return ; } int i = left; int ...
- 随手编程---快速排序(QuickSort)-Java实现
背景 快速排序,是在上世纪60年代,由美国人东尼·霍尔提出的一种排序方法.这种排序方式,在当时已经是非常快的一种排序了.因此在命名上,才将之称为"快速排序".这个算法是二十世纪的七 ...
- 算法实例-C#-快速排序-QuickSort
算法实例 ##排序算法Sort## ### 快速排序QuickSort ### bing搜索结果 http://www.bing.com/knows/search?q=%E5%BF%AB%E9%80% ...
- python Quicksort demo
__author__ = 'student' ''' quicksort step 1, choose one pivot, such as pivot=la[0] step 2, scan the ...
- 63.如何对单链表进行快排?和数组快排的分析与对比[quicksort of array and linked list]
[本文链接] http://www.cnblogs.com/hellogiser/p/quick-sort-of-array-and-linked-list.html [题目] 单链表的特点是:单向. ...
- 这个代码怎么改??Help快速排序 quicksort
#include<stdio.h>int a[101],n;void quicksort(int left,int right){ int i,j,t,temp; if(l ...
随机推荐
- Typecho防黑安全加固-修改后台路径
删除安装文件 成功安装后删除install.php文件.install/文件夹. 修改后台地址 把admin修改为黑客猜不到的名字,例如pipixia,防止黑客穷举密码. 修改admin文件夹名称 修 ...
- Shell - shell中的数组
Shell 数组用括号来表示,元素用 "空格" 符号分隔开,语法格式如下: arrName = (value1 value2 value3)(这种方式带值) 往数组里添加值,数组的 ...
- TypeError: Cannot read properties of null (reading 'level')
一.分析问题 1.一个下拉框组件的更新由另一个下拉框组件控制被动更新列表,子级下拉框的值是由父级下拉框的值调用接口获取,每次父级下拉框值的改变都会改变子级下拉框的数据源也就是会改变子级下拉框的opti ...
- 非容器环境中使用Selenium,提升Chrome与ChromeDiver兼容性
背景 在 Windows 环境下使用 Selenium 时,Chrome 浏览器版本与 ChromeDriver 版本的兼容性问题是一个常见的困扰. 由于 Chrome 频繁更新,而 ChromeDr ...
- Cordova基本使用(一)
简述 Apache Cordova是一个开源的移动开发框架.允许你用标准的web技术-HTML5,CSS3和JavaScript做跨平台开发. 应用在每个平台的具体执行被封装了起来,并依靠符合标准的A ...
- linux中如何判断一个rpm是手动安装还是通过yum安装的
现状 对于一个不熟悉的服务器或者是虽然是自己的服务器,但历史比较久远,对于上面安装了的一些软件包,我们记忆都慢慢模糊了. 我今天遇到一个情况,在安装一个工具x2openEuler时,安装失败,提示依赖 ...
- vscode如何退出/切换 github 账号
退出/切换 github 账号 左下角点击头像按钮,选择注销,然后再重新登录
- go ceph s3文件管理
导入依赖 go get gopkg.in/amz.v1/aws go get gopkg.in/amz.v1/s3 创建用户 在初始化连接之前,我们需要创建一个用户得到accessKey和secret ...
- websocket: the client is not using the websocket protocol: ‘upgrade’ token not found in ‘Connection’ head,客户端没有使用websocket协议:'upgrade'令牌未在'Connection'头中找到
错误分析 websocket: the client is not using the websocket protocol: 'upgrade' token not found in 'Connec ...
- 从 PostgreSQL 升级至 IvorySQL 4.0
本文作者:严少安,IvorySQL 贡献者. 本文为授权转载. 2024 年 8 月,我在<PG 12 即将退役,建议升级到 16.4>一文中提到,PostgreSQL 12 版本即将&q ...