选择排序原理比较简单,首先在未排序的序列定义初始值,再从剩余的序列中继续最小值(最大值),如果发现此值比初始值小(大),则将游标的位置设置成当前值的位置(比初始值小(大)),以此类推
下面贴代码
class Program { static void SelectionSort<T>(T[] arr)where T:IComparable<T> { for (int i = 0; i < arr.Length-1; i++) { int min = i; for (int j = i+1; j < arr.Length; j++) { if (arr[i].CompareTo(arr[j])>0) { min = j; } } if (min != i) { var temp = arr[min]; arr[min] = arr[i]; arr[i] = temp; } Print(arr); } } static void Print<T>(T[] arr) { for (int i = 0; i < arr.Length; i++) { Console.Write(arr[i] + " "); } Console.Write("\n"); } static void Main(string[] args) { int[] arr = { 8, 7, 6, 5 }; Program.SelectionSort(arr); } }
这里面还能进行优化,既然能够储存最小值,那当然也能储存最大值,只需要设置多一个max变量用来存储最大值就可以了。那么趟数就可以减少一半
static void SelectSortSecond<T>(T[] arr) where T : IComparable<T> { //决定趟数 for (int i = 0; i < arr.Length/2; i++) { //判断是否排序 bool Sorting = false; //用来储存最小值下标 int min = i; //用来储存最大值下标 int max = arr.Length; //i需要跟i+1以及其后面的元素进行比较 for (int j = i + 1; j < arr.Length; j++) { //如果arr[j]比arr[min]小,将j值赋值给min if (arr[min].CompareTo(arr[j]) > 0) { min = j; } if (arr[max].CompareTo(arr[j]) < 0) { max = j; } } //如果min值不与i相等,则交换两者的值 if (min != i) { var temp = arr[min]; arr[min] = arr[i]; arr[i] = temp; Sorting = true; } if (max != arr.Length) { var temp = arr[max]; arr[max] = arr[i]; arr[i] = temp; Sorting = true; } if (Sorting == false) { return; } Print(arr); } }
新人还在学习中,如果有错请帮忙纠正,谢谢dalao
原文:https://www.cnblogs.com/Reninsummer/p/11235082.html