一、基本思想
选择排序首先遍历列表,并且将最小的元素与第一个元素进行比较,随后遍历剩余的元素并将次小的元素与第二个元素进行比较,依次类推。
二、算法描述
选择排序算法从索引0处开始确定列表中最小元素的位置,并交换这个最小元素与arr[0]中元素的位置,该步骤会将最小的元素放在arr[0]中,列表中其他元素则保持无序状态;
1. 排序处理继续前进至索引1,并且确定子列表arr[1]…arr[n-1]中最小元素的位置,交换这个最小元素与arr[1]中元素的位置,这样列表中的前两个位置中的元素已经按顺序排列了;
2. 从位置2开始到n-2处,重复进行类似的排序处理。因为前面所有的交换已经使arr[n-1]中的元素最大,所以在位置n-1处不会发生选择操作。
3. 选择排序算法涉及n-1次迭代,因为每次迭代都涉及通过遍历子列表中的元素来定位最小元素的索引,所以将每次迭代成为一个pass。
三、示例代码
public static void selectionSort(int[] arr)
{
int smallIndex;
int pass;
int j;
int temp;
int n = arr.Length;
for (pass = 0; pass < n - 1; pass++)
{
// 假定最小值初始时是arr[pass]=1st
smallIndex = pass;
// 遍历子列表,从arr[pass+1]到arr[n-1]
//j从pass+1开始,因为从0到pass已经是有序的了
for (j = pass + 1; j < n; j++)
{
//如果发现小元素,把当前元素的索引赋值给最小值
//这其实就是一个找最小元素的过程
if (arr[j] < arr[smallIndex])
{
smallIndex = j;
}
}
//交换
temp = arr[pass];
arr[pass] = arr[smallIndex];
arr[smallIndex] = temp;
}
}
四、效率分析
不稳定
空间复杂度:O(1)
时间复杂度:O(n2)
最坏情况:O(n2) 第一个元素为最大元素,其余元素正序,需要交换n-1个元素(如:4 3 2 1)
最好情况:O(n2) 正序,不需要交换元素