选择排序是一种简单直观的排序算法,其基本原理是将待排序序列分成无序区和有序区,每次从无序区选取最小元素,放置到有序区末尾。重复这个过程,直到整个序列完成排序。如同其他排序算法一样,选择排序在 C# 编程中使用广泛,本文将深入讨论 C# 中选择排序的实现方法,并探讨如何对排序算法进行优化,以提高程序性能。
C# 程序中,选择排序可以用以下代码简单实现:
public static void SelectionSort<T>(T[] array) where T : IComparable<T> {
for(int i=0;i<array.Length-1;i++){
int min = i;
for(int j=i+1;j<array.Length;j++){
if(LessThan(array[j], array[min])){
min = j;
}
}
Swap(array, i, min);
}
}
在以上代码中,用 i 作为指向无序区间最前面的元素的下标,min 保存找到的最小元素下标。在 for 循环中,开始遍历整个无序区间,找到序列中最小的元素位置,并将其与序列开始位置的元素交换位置,使得该元素成为有序区间的一份子。重复这个过程知道序列中所有的元素都排好序。
在实现选择排序时,还可以通过以下优化方法提高程序性能:
1. 减少交换操作的数量:尽量在一轮遍历后再进行数据的交换操作,可以避免引起数据的不必要动作,进一步提高了程序性能。
2. 在代码实现时,还可以采用第二个 for 循环里 j 从 i+1 开始的方法,这样更清晰明了。
在以上基础上的代码实现如下:
public static void SelectionSort<T>(T[] array) where T : IComparable<T> {
for(int i=0;i<array.Length-1;i++){
int minIndex = i;
for(int j=i+1;j<array.Length;j++){
if(LessThan(array[j], array[minIndex])){
minIndex = j;
}
}
if(i != minIndex){
Swap(array, i, minIndex);
}
}
}
在以上代码中,通过 lessThan 方法实现比较, Swap 方法实现数据交换。在内部 for 循环中,找到最小元素的下标,并保留该元素的位置,之后进行一部分的交换操作,将其与无序区间中的元素进行交换。
下面是我自己写的一个简单实现代码:
private int min;
public void Sort(int[] list)
{
for (int i = 0; i < list.Length - 1; i++)
{
min = i;
for (int j = i + 1; j < list.Length; j++)
{
if (list[j] < list[min])
min = j;
}
int t = list[min];
list[min] = list[i];
list[i] = t;
}
}