C# 算法之选择排序
1、简介
选择排序是排序中比较简单的一种,实现的大致思路如下:首先我们拿到一个需要排序的数组,假设该数组的第一个元素是最小的,然后将数组中剩下的元素,于最小的元素进行比较,如果中间有比第一个元素的小的,那么设当前元素为最小的,然后剩下的元素在和当前元素进行比较,直到找到最小的.这时候第一轮循环结束,我们可以找到当前数组中最小的那个元素,在和第一个元素交换位置.第二轮循环开始,这个时候我们以及确定第一个元素是最小的,所以这轮循环第一个元素将不参与运算.这轮循环,假设第一个元素是最小的,剩下的步骤和第一轮一样.
2、C#实现
代码如下:
/// <summary>
/// 选择排序
/// </summary>
public class SelectctionSort
{
static void Main(string[] args)
{
var arr = new IComparable[] { ,,,,,, };
var result= Sorted(arr);
Array.ForEach(arr, Console.WriteLine);
Console.WriteLine("排序是否成功?{0}", IsSorted(result) ? "是" : "否");
Console.ReadKey();
} /// <summary>
/// 选择排序Main方法
/// </summary>
/// <param name="array"></param>
/// <returns></returns>
public static IComparable[] Sorted(IComparable[] array)
{
int count = array.Length;
for (int i = ; i < count; i++)
{
//假设每一轮外循环的第一个是最小的
int min = i;
for (int j = i + ; j < count; j++)
if (Less(array[j], array[min])) min = j;
Exchange(array, i, min);
}
return array;
} /// <summary>
/// 判断两个元素的大小
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
private static bool Less(IComparable a, IComparable b)
{
var res = a.CompareTo(b);
return res < ;
} /// <summary>
/// 交换一轮循环后的结果
/// </summary>
/// <param name="array"></param>
/// <param name="i"></param>
/// <param name="min"></param>
private static void Exchange(IComparable[] array,int i,int min)
{
var temp = array[i];
array[i] = array[min];
array[min] = temp;
} /// <summary>
/// 判断排序是否正确
/// </summary>
/// <param name="array"></param>
/// <returns></returns>
private static bool IsSorted(IComparable[] array)
{
for (int i = ; i < array.Length; i++)
{
if (Less(array[i], array[i-])) return false;
}
return true;
}
}

总结:内循环,负责找出这轮循环中最小的元素,外循环负责将内循环最小的元素与本轮循环中第一个元素进行交换位置,并确保下一轮外循环第i(外循环的当前索引)小的元素不参与下一轮的比较.流程图大致如下:

每一轮外循环i(假设有i个元素)都推举出第i小的元素,将它和第一个元素交换位置,直到所有的元素排序完毕!
重点:
通过代码和图可以推算出选择排序一共会进行N次交换(哪怕数组是有序的,通过观察代码可以发现),一共会进行(N-1)+(N-2)+(N-3)+.....+2+1(标准的等差数列,计算方式自行百度)等于N^2/2次比较.
优缺点分析:
移动数据很少,成线性关系即y(交换次数)=x(数组长度)
比较次数过多,成指数关系,随着元素的个数增多,开销指数级增大 y(比较次数)=n(数组长度)^2/2
所以,数组元素过多时,不建议使用.
C# 算法之选择排序的更多相关文章
- Java中的经典算法之选择排序(SelectionSort)
Java中的经典算法之选择排序(SelectionSort) 神话丿小王子的博客主页 a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...
- java结构与算法之选择排序
一 .java结构与算法之选择排序(冒择路兮快归堆) 什么事选择排序:从一组无序数据中选择出中小的的值,将该值与无序区的最左边的的值进行交换. 简单的解释:假设有这样一组数据 12,4,23,5,找到 ...
- 【DS】排序算法之选择排序(Selection Sort)
一.算法思想 选择排序是一种简单直观的排序算法.它的工作原理如下: 1)将序列分成两部分,前半部分是已经排序的序列,后半部分是未排序的序列: 2)在未排序序列中找到最小(大)元素,放到已排序序列的末尾 ...
- Python排序算法之选择排序定义与用法示例
Python排序算法之选择排序定义与用法示例 这篇文章主要介绍了Python排序算法之选择排序定义与用法,简单描述了选择排序的功能.原理,并结合实例形式分析了Python定义与使用选择排序的相关操作技 ...
- Java实现 蓝桥杯VIP 算法提高 选择排序
算法提高 选择排序 时间限制:1.0s 内存限制:256.0MB 选择排序 问题描述 排序,顾名思义,是将若干个元素按其大小关系排出一个顺序.形式化描述如下:有n个元素a[1],a[2],-,a[ ...
- 八大排序算法~简单选择排序【记录下标k变量的作用】
八大排序算法~简单选择排序[记录下标k变量的作用] 1,思想:打擂台法,数组中的前n-1个元素依次上擂台"装嫩",后边的元素一个挨着一个不服,一个一个上去换掉它 2,优化:通过记录 ...
- 排序算法总结------选择排序 ---javascript描述
每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...
- java基础算法之选择排序
选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完. ...
- 八大排序算法之三选择排序—简单选择排序(Simple Selection Sort)
基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...
- 常用排序算法之——选择排序(C语言+VC6.0平台)
选择排序是另一种经典排序算法,核心思想是:在一趟找最小(大)数的过程中,先假设待排数据中的第一个数据即为最小(大)数据,然后循环将其他数据与该数据比较,每次比较时若小于该数据则让新数据成为最小(大)数 ...
随机推荐
- Docker学习笔记:基础
docker的概念 :docker是一个可供开发者在容器中 开发 部署 运行 应用的一个平台.通过使用Linux容器去部署应用的方式称为容器化. 基础概念 Images and Container i ...
- ----XMLHttpRequestAPI简单介绍----
XMLHttpRequest 使用XMLHttpRequest (XHR)对象可以与服务器交互.您可以从URL获取数据,而无需让整个的页面刷新.这使得Web页面可以只更新页面的局部,而不影响用户的操作 ...
- 构建你的spring boot代码
Spring boot不需要任何特定的代码布局来工作.然而,有一些最佳实践可以帮助您. 1.避免使用缺省包 当一个类不包含包声明时,它被认为是在“缺省包”中.“默认包”的使用通常是不鼓励的,应该避免. ...
- C# Winform Soket 网络编程 多个客户端连接服务器并返回客户端操作请求
2017.8.2 服务器: #region 参数与集合 /// <summary> /// 客户端IP /// </summary> string clientIP; /// ...
- Python几周学习内容小结
环境配置 学习python首先是要配置环境,我们选择了Anaconda. 什么是Anaconda:专注于数据分析的python发行版本. 为什么选择Anaconda:省事省心,分析利器 至于下载和安装 ...
- Apache万网SSl证书安装不成功的一个注意事项(https安全链接,基于phpstudy)
最近,微信小程序挺火,要做小程序网站域名必须要有ssl证书,形成https://的安全链接,我于是从万网上下载了一个免费的ssl证书,按照万网提供的安装方式怎么也安装不好,最后我这个Apache小白费 ...
- Linux环境(Centos7)下部署.NetCore2.0的Web应用
Web应用基于Windows环境下开发,然后部署到Linux 1.进入VS2017,点击新建->项目->.NetCore->ASP.NET Core Web应用程序,确定 2.选择W ...
- (29)Why Earth may someday look like Mars
https://www.ted.com/talks/anjali_tripathi_why_earth_may_someday_look_like_mars/transcript00:12So whe ...
- oracle创建与mysql的dblink
1.先简单介绍下环境 操作系统:windows 2008 R2 (64bits) oracle数据库:10gr2 10.2.0.3.0(32bits) mysql数据库:5.1 (32bits) ...
- IMDb、烂番茄、MTC、各种电影行业评分名字整理
这篇不是技术文章,就是对总是看到但是不知道具体是什么的一些电影名词.评分.来源,学习一下. IMDb 互联网电影资料库(Internet Movie Database,简称IMDb)是一个关于电影演员 ...