基本思想
每一趟从待排序的数据元素中选出最小(最大)的元素,顺序放在待排序的数列最前,直到全部待排序的数据元素全部排完。
特点
数据结构:数组
稳定性:不稳定
过程
初始关键字:『 8,5,2,6,9,3,1,4,0,7 』
第一趟排序后:0,『5,2,6,9,3,1,4,8,7』
第二趟排序后:0,1,『2,6,9,3,5,4,8,7』
第三趟排序后:0,1,2,『6,9,3,5,4,8,7』
第四趟排序后:0,1,2,3,『9,6,5,4,8,7』
第五趟排序后:0,1,2,3,4,『6,5,9,8,7』
第六趟排序后:0,1,2,3,4,5,『6,9,8,7』
第七趟排序后:0,1,2,3,4,5,6,『9,8,7』
第八趟排序后:0,1,2,3,4,5,6,7,『8,9』
第九趟排序后:0,1,2,3,4,5,6,7,8,『9』
结果: 『 0,1,2,3,4,5,6,7,8,9 』
排序过程 宏观过程
复杂度与辅助空间
最差时间复杂度:O(n^2)
最优时间复杂度:O(n^2)
平均时间复杂度:O(n^2)
所需辅助空间:O(1)
实现方法
双重循环,外层i控制当前序列最小(最大)值存放的数组元素位置,内层循环j控制从i+1到n序列中选择最小的元素所在位置k。
源程序
void select_sort(int a[],int n)
{
for(int i=0;i<n-1;i++)//i为已排序序列的末尾
{
for(int j=i+1;j<n;j++){
if(a[j]<a[i]){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
优化
void select_sort(int a[],int n)
{
int min;
for(int i=0;i<n-1;i++)//i为已排序序列的末尾
{
min=i;
for(int j=i+1;j<n;j++)//未排序序列
if(a[j]<a[min])//找出未排序序列中的最小值
min=j;
if(min!=i)
swap(a[i],a[min]);//放到已排序序列的末尾,该操作很有可能把稳定性打乱,所以选择排序是不稳定的排序算法
}
}
JAVA版本
//选择排序
public class SelectionSort {
public static void main(String[] args) {
int[] arr={1,3,2,45,65,33,12};
System.out.println("交换之前:");
for(int num:arr){
System.out.print(num+" ");
}
//选择排序的优化
for(int i = 0; i < arr.length - 1; i++) {// 做第i趟排序
int k = i;
for(int j = k + 1; j < arr.length; j++){// 选最小的记录
if(arr[j] < arr[k]){
k = j; //记下目前找到的最小值所在的位置
}
}
//在内层循环结束,也就是找到本轮循环的最小的数以后,再进行交换
if(i != k){ //交换a[i]和a[k]
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
System.out.println();
System.out.println("交换后:");
for(int num:arr){
System.out.print(num+" ");
}
}
}