选择排序比较简单排序,思路简单直观,每一次循环都会从无序数组中找到最小值都重新排序;
思路:
1. 从数组从选出最小元素,和第一位置数据交换
2. 接着从N-1数据中找到最小值,与第二元素交换
3. 循环,交换数据,知道数据完成排序
Demo: 完整源码地址
/**
* @Title: 排序基本算法
* @Package ${package_name}
* @Description: 排序基本算法
* Created by eason_hoo on 16/8/7.
*/
public abstract class BaseSorter {
//构造sort函数
public abstract void sort(int[] array);
}
/**
* @Title: 选择排序
* @Package org.eason.sort
* @Description: 选择排序 N条数据 需要N-1中间交换 执行的步骤长 效率不高
*
* Created by eason_hoo on 16/9/4.
*/
public class DirectSelectionSorter extends BaseSorter {
int temp; //交换使用中间变量
int index; //记录有序下角标
@Override
public void sort(int[] array) {
//有N个元素 需要N - 1 次循环
for(int i = 0; i < array.length-1; i++){
index = i;
for (int j = i+1; j < array.length; j++){
//当有序数组最大值大于无序数组值需要发生交换
if(array[index] > array[j]){
index = j;
}
}
//发生交换
if (index != i){
temp = array[i];
array[i] = array[index];
array[index] = temp;
}
}
}
}
算法分析:
比较次数:
循环次数: N-1次
第1次排序:比较n-1次;
第2次排序:比较n-2次;
第n-1排序:比较1次。
比较次数为:1+2+……+(n-1) = n(n-1)/2
移动次数:
第1次排序:交换1次,移动3次;
第2次排序:交换1次,移动3次;
第n-1排序:交换1次,移动3次;
总次数:3(n-1)
时间复杂度:
时间复杂读:O(n2)
空间复杂度:
全程只是使用到一个temp 空间复杂度:O(1)
排序稳定性:
数组状态排序中发生变化:直接选择排序是不稳定排序