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# 算法之选择排序的更多相关文章

  1. Java中的经典算法之选择排序(SelectionSort)

    Java中的经典算法之选择排序(SelectionSort) 神话丿小王子的博客主页 a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...

  2. java结构与算法之选择排序

    一 .java结构与算法之选择排序(冒择路兮快归堆) 什么事选择排序:从一组无序数据中选择出中小的的值,将该值与无序区的最左边的的值进行交换. 简单的解释:假设有这样一组数据 12,4,23,5,找到 ...

  3. 【DS】排序算法之选择排序(Selection Sort)

    一.算法思想 选择排序是一种简单直观的排序算法.它的工作原理如下: 1)将序列分成两部分,前半部分是已经排序的序列,后半部分是未排序的序列: 2)在未排序序列中找到最小(大)元素,放到已排序序列的末尾 ...

  4. Python排序算法之选择排序定义与用法示例

    Python排序算法之选择排序定义与用法示例 这篇文章主要介绍了Python排序算法之选择排序定义与用法,简单描述了选择排序的功能.原理,并结合实例形式分析了Python定义与使用选择排序的相关操作技 ...

  5. Java实现 蓝桥杯VIP 算法提高 选择排序

    算法提高 选择排序 时间限制:1.0s 内存限制:256.0MB  选择排序 问题描述 排序,顾名思义,是将若干个元素按其大小关系排出一个顺序.形式化描述如下:有n个元素a[1],a[2],-,a[ ...

  6. 八大排序算法~简单选择排序【记录下标k变量的作用】

    八大排序算法~简单选择排序[记录下标k变量的作用] 1,思想:打擂台法,数组中的前n-1个元素依次上擂台"装嫩",后边的元素一个挨着一个不服,一个一个上去换掉它 2,优化:通过记录 ...

  7. 排序算法总结------选择排序 ---javascript描述

    每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...

  8. java基础算法之选择排序

    选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完. ...

  9. 八大排序算法之三选择排序—简单选择排序(Simple Selection Sort)

    基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...

  10. 常用排序算法之——选择排序(C语言+VC6.0平台)

    选择排序是另一种经典排序算法,核心思想是:在一趟找最小(大)数的过程中,先假设待排数据中的第一个数据即为最小(大)数据,然后循环将其他数据与该数据比较,每次比较时若小于该数据则让新数据成为最小(大)数 ...

随机推荐

  1. navicat for mysql 连接报错1251详细解决步骤

    我的是8.0的版本,因为比较新的mysql采用新的保密方式所以旧的似乎不能用,改密码方式:use mysql:ALTER USER 'root'@'localhost' IDENTIFIED WITH ...

  2. Linq语言,由红色部分可直接代替绿色(List,dictionary)

    /// <summary> /// 获取最近5分钟缓存的车量 /// </summary> /// <param name="carNo">&l ...

  3. 从文件中读取数组数据————Java

    自己总结一下Java文件的读取类似数组数据的方法,自己可以快速查看. 一.规整化数据: 对于数组数据是一一对应的情况 ArrayList<String> arrayList = new A ...

  4. vue+betterscrool实现横向弹性滚动

    如何利用better-scroll在vue中实现横向滚动,并且滚动到两端以后会有弹性效果 1.使用npm下载better-scroll 2.按需引入better-scroll 3.需要2个盒子装起来组 ...

  5. vue学习_01

    一.什么是VUE 渐进式的前端框架,MVVM(Model,view,viewmodel)模式,饿了么用的就是vue框架 二.VUE基本语法 1.引入vue: <script src=" ...

  6. mpvue 初体验之改写车标速查小程序

    前文 说到我开发了一个简单的小程序叫做 车标速查(代码以及二维码详见 这里),本文简单讲讲如何将这个小程序转为 mpvue 开发(最终 成果 ) mpvue 官网的 文档 真的是非常简单,不,应该说是 ...

  7. MVC实例应用

    MVC是Model-View-Controller的简称,即模型-视图-控制器.MVC是一种设计模式, 它把应用程序分成三个核心模块:模型.视图.控制器,它们各自处理自己的任务. 1.模型(Model ...

  8. Python爬虫的学习经历

    在准备学习人工智能之前呢,我看了一下大体的学习纲领.发现排在前面的是PYTHON的基础知识和爬虫相关的知识,再者就是相关的数学算法与金融分析.不过想来也是,如果想进行大量的数据运算与分析,宏大的基础数 ...

  9. autium designer smart pdf一个小问题

    今天在使用ad的smart  pdf时遇到一个小问题  就是 使用的是AD17,生成PDF,PDF没有把芯片的引脚标号显示出来(还有其它的芯片也是一样的,但是奇怪的是:只有在原理图元器件右边的没有显示 ...

  10. pyqt5安装问题

    最近装了下pyqt5,遇到了很多坑,要么是模块没找到,要么是各种ddl出错什么的 后来查了一下,总结一下: 1.pyqt5和python的版本一定匹配,尤其是自己去网上下的pyqt一定要注意适配的版本 ...