博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 算法之选择排序
阅读量:6466 次
发布时间:2019-06-23

本文共 2372 字,大约阅读时间需要 7 分钟。

 1、简介

选择排序是排序中比较简单的一种,实现的大致思路如下:首先我们拿到一个需要排序的数组,假设该数组的第一个元素是最小的,然后将数组中剩下的元素,于最小的元素进行比较,如果中间有比第一个元素的小的,那么设当前元素为最小的,然后剩下的元素在和当前元素进行比较,直到找到最小的.这时候第一轮循环结束,我们可以找到当前数组中最小的那个元素,在和第一个元素交换位置.第二轮循环开始,这个时候我们以及确定第一个元素是最小的,所以这轮循环第一个元素将不参与运算.这轮循环,假设第一个元素是最小的,剩下的步骤和第一轮一样.

 

2、C#实现

代码如下:

///     /// 选择排序    ///     public class SelectctionSort    {        static void Main(string[] args)        {            var arr = new IComparable[] { 7,3,5,1,2,89,8 };            var result= Sorted(arr);            Array.ForEach(arr, Console.WriteLine);            Console.WriteLine("排序是否成功?{0}", IsSorted(result) ? "是" : "否");            Console.ReadKey();        }        ///         /// 选择排序Main方法        ///         ///         /// 
public static IComparable[] Sorted(IComparable[] array) { int count = array.Length; for (int i = 0; i < count; i++) { //假设每一轮外循环的第一个是最小的 int min = i; for (int j = i + 1; j < count; j++) if (Less(array[j], array[min])) min = j; Exchange(array, i, min); } return array; } /// /// 判断两个元素的大小 /// /// /// ///
private static bool Less(IComparable a, IComparable b) { var res = a.CompareTo(b); return res < 0; } /// /// 交换一轮循环后的结果 /// /// /// /// private static void Exchange(IComparable[] array,int i,int min) { var temp = array[i]; array[i] = array[min]; array[min] = temp; } /// /// 判断排序是否正确 /// /// ///
private static bool IsSorted(IComparable[] array) { for (int i = 1; i < array.Length; i++) { if (Less(array[i], array[i-1])) 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

所以,数组元素过多时,不建议使用.

 

转载于:https://www.cnblogs.com/GreenLeaves/p/10275002.html

你可能感兴趣的文章
MyBatis+Spring结合
查看>>
Office 365之SkyDrive Pro
查看>>
Java Web 高性能开发
查看>>
Scala之柯里化和隐式转换
查看>>
健忘的正则
查看>>
[转]CMake快速入门教程:实战
查看>>
IntelliJ IDEA创建JavaWeb工程及配置Tomcat部署
查看>>
Markdown用法
查看>>
轮播插件swiper.js?
查看>>
15 个 Android 通用流行框架大全
查看>>
IE8兼容@media和mp4视频的解决方案
查看>>
【转】知道这20个正则表达式,能让你少写1,000行代码
查看>>
自定义 启动和关闭 oracle 的命令
查看>>
Quartz
查看>>
正则表达式介绍
查看>>
初识Scala反射
查看>>
第三十九天
查看>>
Redis详解
查看>>
论程序员加班的害处
查看>>
codeblocks快捷键
查看>>