C#之快速排序
算法描述
1.假定数组首位元素为“枢轴”,设定数列首位(begin)与末位(end)索引;
2.由末位索引对应元素与“枢轴”进行比较,如果末位索引对应元素大于“枢轴”元素,对末位索引减一(end--),直到比较出大于“枢轴”元素,将该元素覆盖到首位,对应索引上的数值空出;
3.由首位索引对应元素与“枢轴”进行比较,如果首位索引对应元素小于“枢轴”元素,对首位索引加一(begin++);直到比较出小于“枢轴”元素,将该元素覆盖到步骤2中空出位置,同时对应索引上的数值空出;
4.重复步骤2与步骤3,直到begin==end结束循环,这时候begin与end已指向同一位置,将“枢轴”元素覆盖到该位置;
5.这时候该位置前面元素都小于“枢轴”元素,该位置后面元素都大于“枢轴”元素,第一轮循环结束,对前后两部分执行相同步骤,通过“递归”最终将数组中数值完成排序;
代码实现
public int[] Quick(int[] arr, int begin, int end) // 通过自我调用实现“递归”
{
if (begin >= end)
{
return arr;
} int pivotIndex = QuickCondition(arr, begin, end); // 获得“枢轴”索引 Quick(arr, begin, pivotIndex - ); // 对所有小于“枢轴”元素再次比较
Quick(arr, pivotIndex + , end);// 对所有大于“枢轴”元素再次比较 return arr;
} public int QuickCondition(int[] arr, int begin, int end)
{
int pivot = arr[begin]; // 设定首位为“枢轴”元素 while (begin < end)
{
while (arr[end] > pivot && begin < end) // 通过比较找到小于“枢轴”元素的索引,进行替换
{
end--;
} arr[begin] = arr[end]; while (arr[begin] < pivot && begin < end) // 通过比较找到第大于“枢轴”元素的索引,进行替换
{
begin++;
} arr[end] = arr[begin];
}
arr[begin] = pivot; // 当begin == end 跳出循环将“枢轴”覆盖到该索引上 return begin;
}
完整代码
using System; namespace QuickSortApplication
{
class Program
{
static void Main(string[] args)
{
var setArray = new SetArray();
var quickSort = new QuickSort(); int[] arr = setArray.GetArray();
int[] array = quickSort.Quick(arr, , arr.Length - );
quickSort.DisPlay(array); Console.ReadLine();
}
} class SetArray
{
public int[] GetArray()
{
int length;
int[] arr; Console.WriteLine("请输入数组长度:");
length = Convert.ToInt32(Console.ReadLine()); arr = new int[length]; for (int i = ; i <= length - ; i++)
{
Console.Write("请输入数组第{0}位数值:", i);
arr[i] = Convert.ToInt32(Console.ReadLine());
} Console.Clear(); Console.Write("arr[] = {");
foreach (int item in arr)
{
Console.Write(item + " ");
}
Console.Write("}\n");
return arr;
}
} class QuickSort
{
public int[] Quick(int[] arr, int begin, int end) // 通过自我调用实现“递归”
{
if (begin >= end)
{
return arr;
} int pivotIndex = QuickCondition(arr, begin, end); // 获得“枢轴”索引 Quick(arr, begin, pivotIndex - ); // 对所有小于“枢轴”元素再次比较
Quick(arr, pivotIndex + , end);// 对所有大于“枢轴”元素再次比较 return arr;
} public int QuickCondition(int[] arr, int begin, int end)
{
int pivot = arr[begin]; // 设定首位为“枢轴”元素 while (begin < end)
{
while (arr[end] > pivot && begin < end) // 通过比较找到小于“枢轴”元素的索引,进行替换
{
end--;
} arr[begin] = arr[end]; while (arr[begin] < pivot && begin < end) // 通过比较找到第大于“枢轴”元素的索引,进行替换
{
begin++;
} arr[end] = arr[begin];
}
arr[begin] = pivot; // 当begin == end 跳出循环将“枢轴”覆盖到该索引上 return begin;
} public void DisPlay(int[] arr)
{
Console.Write("快速排序:");
foreach (int item in arr)
{
Console.Write(item + " ");
}
Console.WriteLine();
}
}
}
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 ...
随机推荐
- 后台管理进程GameMaster
初步准备在后台加一个进程,用来控制进程中的各种数据,修改,查看,删除玩家数据类似于后端的gm控制平台
- Python自动监控错误日志
平时在查看日志的时候打开满屏的日志,看上去有点凌乱.于是写个Python脚本过滤出想要看的错误的日志.直接上脚本 脚本示例 def read_log(logname,keyword): tell = ...
- 联想 Z5 Pro(L78031)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖ZUI 10.0.355
>>>重点介绍<<< 第一:本刷机包可卡刷可线刷,刷机包比较大的原因是采用同时兼容卡刷和线刷的格式,所以比较大第二:[卡刷方法]卡刷不要解压刷机包,直接传入手机后用 ...
- java死锁问题
一.先从定义上了解一下死锁 二.从代码角度上去解释一下死锁问题 三.上述程序就是出现了死锁,我们来查看一下 1.命令如下 cmd>>jps(查看到了死锁线程所在的类,前面是PID) 2 ...
- Deployd的使用
deployd一个生成后台数据的软件,可以创建json格式的数据,也可以对数据进行增删改查等操作,甚至可以验证登录,简直就是自学好帮手呀,不用后台搞定后台,就用deployd 下载:链接: https ...
- Redis系列(四)--持久化
持久化就是将数据的更新异步的保存到磁盘中 持久化方式: 1.快照:某个时间点数据的备份 MySQL dump.Redis RDB 2.写日志:MySQL BinLog.HBASE Hlog.Redis ...
- ocelot+consul+identity4的使用demo
Ocelot网关搭建 搭建core控制台项目 本demo采用2.1版本 命名为APPIGateWay 在Nuget包中添加Ocelot引用 选用8.0.0版本 添加Ocelot.json 文件 内容为 ...
- console.log格式化及console对象
一.console.log格式化打印 console.log格式化这一用法一般都在个人博客或其他官网上有,当F12查看网页元素时,在控制台(console)那里偶尔会发现一些个性化的输出,感觉很奇特很 ...
- PHP上传文件到七牛(Qiniu)
上传文件到七牛最简单的方式就是使用七牛官方最新的SDK 安装PHP SDK composer require qiniu/php-sdk 上传文件到七牛 use Qiniu\Auth; use Qin ...
- CCF201703-2 学生排队 java(100分)
试题编号: 201703-2 试题名称: 学生排队 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 体育老师小明要将自己班上的学生按顺序排队.他首先让学生按学号从小到大的顺序排 ...