排序算法之选择排序
时间复杂度和空间复杂度说:
选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) (因为双循环的原因) 的时间复杂度。
所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。
算法思想步骤:
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
重复第二步,直到所有元素均排序完毕。
动画效果:https://www.runoob.com/w3cnote/selection-sort.html
图示:
算法分解:
第一步找到最大或最少元素:
//寻找数据最小的元素
int[] arry = { 5, 2, 1, 7, 4, 3, 6 };
//第一次是从第0个位置开始的
FindMinNum (arry, 0);
static void FindMinNum(int[] arry, int i) { int mosPos = i; for (int j = i + 1; j < arry.Length; j++) { if (arry[j] < arry[mosPos]) { //找到最小索引 mosPos = j; } } Console.WriteLine("最小值的索引是:" + mosPos); Console.WriteLine("最小值是:" + arry[mosPos]); }
//输出了值
//下一步就要进行交换了,所以就写一个交换方法
/// <summary>
/// 交换数据组方法
/// </summary>
/// <param name="currentIndex">当前要比较交换的索引</param>
/// <param name="mosPos">查找到命中到的最大(小)索引值</param>
/// <param name="arr">数据源</param>
static void SwapArr(int currentIndex, int mosPos, int[] arr) {
var temp = arr[currentIndex];
arr[currentIndex] = arr[mosPos];
arr[mosPos] = temp;
}
//第一次打印结果:
第一次效果就是这样分解出来了,完整理的代码 就是在外层加一个循环最找,然后每次替换
int[] arry = { 5, 2, 1, 7, 4, 3, 6 };
for (int i = 0; i < arry.Length - 1; i++)
{
FindMinNum(arry, i);
}
//打印方法
PrintCw(arry);
FindMinNum 如下:
//寻找数据最小的元素 static void FindMinNum(int[] arry, int i) { int mosPos = i; for (int j = i + 1; j < arry.Length; j++) { if (arry[j] < arry[mosPos]) { //找到最小索引 mosPos = j; } } Console.WriteLine("最小值的索引是:" + mosPos); Console.WriteLine("最小值是:" + arry[mosPos]); //表示有变化则替换 if (i != mosPos) { SwapArr(i, mosPos, arry); } } /// <summary> /// 交换数据组方法 /// </summary> /// <param name="currentIndex">当前要比较交换的索引</param> /// <param name="mosPos">查找到命中到的最大(小)索引值</param> /// <param name="arr">数据源</param> static void SwapArr(int currentIndex, int mosPos, int[] arr) { var temp = arr[currentIndex]; arr[currentIndex] = arr[mosPos]; arr[mosPos] = temp; } //打印方法 static void PrintCw(int[]arry) { for (int i = 0; i < arry.Length; i++) { Console.WriteLine(arry[i] + ""); } }
打印结果如下:
方法还可以适当优化,先学习算法思想,一步一步分解,自已要敲,调式,不是一步就写出来的.