算法思想
选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
简而言之,选择排序就两步:
1.选择最小(或最大)
2.交换
代码实现
测试代码
public static void main(String[] args) {
int[] array = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
// 只需要修改成对应的方法名就可以了
selectionSort(array);
System.out.println(Arrays.toString(array));
}
public class SelectionSort
{
//基于数组
public static void sort(int[] a)
{
//将a[]按升序排列
for(int i=0;i<a.length;i++)
{
int min=i;
//循环一次,找出从a[i]到a[N-1]中最小的元素
for(int j=i+1;j<a.length;j++)
{
if(a[j]<a[min])
min=j; //将最小元素的下标给min
}
//交换元素,将最小元素与a[i]交换
int temp=a[i];
a[i]=a[min];
a[min]=a[j];
}
}
}
复杂度分析
时间复杂度
当i==0
的时候,j的取值范围是从1到n-1,内循环的判断一次执行了n-1次
当i==1
的时候,j的取值范围是从2到n-1,内循环的判断一次执行了n-2次
以此类推…
根据高斯公式得:进行1/2N²+1/2N次比较和N次交换,所以时间复杂度是o(n^2)
空间复杂度
开辟了min,所以空间复杂度是o(1)
稳定性分析
选择排序是不稳定的排序算法,因为交换操作造成了不稳定,所以想要把它变得稳定只需要将交换变为移动,即将每一次选择出的最小关键字前面的无序数组元素都向后移动一个位置。
public class SelectionSort
{
public static void sort(int[] a,int n)
{
//与默认的实现方式相同
for(int i=0;i<n-1;i++)
{
//a[i-1]之前的元素为数组的有序部分
//从arr[i]到arr[n-1]找到最小元素的下标保存到min中
int min=i;
for(int j=i+1;j<n;j++)
if(a[min]>a[j])
min=j;
//将最小的元素移动到当前的位置i
int key=a[min];
//将从i到min-1的元素都向后移动一个位置
while(min>i)
{
a[min]=a[min-1];
min--;
}
//将当前选择的最小元素放在正确的位置
a[i]=key;
}
}
}