选择排序是一种最简单的排序方式,主要的思想:
首先,找到数组中最小的那个数及其下标,将最小的这个数与数组第一个数交换位置,那么这个最小的数就在数组的第一个位置了,然后从数组第二个位置开始寻找最小的数,找到后与数组的第二个位置的数进行交换,如果没找到,就自己交换自己。反复下去,就得到了排序的数组。这种方法就叫选择排序,因为它总是在不选的选择剩余元素的最小值。
案例图示:
代码
public static void select(int[] a)
{
for (int i=0;i<a.length;i++)
{
int temp=a[i];//将未排序的第一个元素存到temp
int k=i;//将未排序的第一个元素的下标保存到k
int p;//作为两个元素交换的过渡值
for (int j=i+1;j<a.length;j++)
{
if(temp<a[j])//找出未排序元素的最小值和下标
{
temp=a[j];
k=j;
}
}
//如果未排序的第一个元素本身就是最小值了,那么此时的i与k就是相等的,相当于自身交换
p=a[i];
a[i]=temp;
a[k]=p;
}
}
两个特点:
1.运行时间与输入无关,因为不论是乱序数组还是已经有序的数组,它都会进行比较和交换。
2.数据移动是最少的,每次交换都会改变两个数组元素的值,因此如果数组大小是N的话,就交换了N次,因此交换次数与数组大小成线性关系
时间复杂度分析:
为了确定数组第一个位置的元素,需要比较N-1次,确定数组第二个位置的元素,需要比较N-2次,以此类推,总共需要比较(N-1)+(N-2)+......+2+1=N*(N-1)/2,所以时间复杂度为