一)算法介绍
选择排序是一种简单直观的排序算法。属于不稳定排序。
不稳定排序:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面。
备注:选择排序时间复杂度一直是O(n^2),适用于数据规模小,不占用额外内存空间的场景。
二)算法原理
基本原理:先从待排序的数据元素中选出最小(最大)元素,存放到起始位置(可以假设第一个元素就是最小或最大值),然后从剩下的数据中再寻找最小(最大)元素,存放到已排序元素的末尾。
算法步骤图解:
源数据:
第一遍排序:先假设第一个元素是最小元素,比较3>1,把1标记为最小元素,然后用最小元素1和数据中元素9、元素2、元素4、元素6依次比较,查看是否有比1还小的元素,此处没有比1还小的元素,把最小的元素1和数据中第一个元素交换位置。最小的元素就排列到第一位了。
第二遍排序:再假设第二个元素是最小元素,比较3<9,3还是最小元素,然后比较3>2,把2标记为最小元素,用最小元素2和数据中元素4、元素6依次比较,查看是否有比2还小的元素,此处没有比2还小的元素,把最小的元素2和数据中第二个元素交换位置。最小的元素就排列到第二位了。
第三遍排序:再假设第三个元素是最小元素,比较9>3,把3标记为最小元素,用最小元素3和数据中元素4、元素6依次比较,查看是否有比3还小的元素,此处没有比3还小的元素,把最小的元素3和数据中第三个元素交换位置。最小的元素就排列到第三位了。
第四遍排序:再假设第四个元素是最小元素,比较9>4,把4标记为最小元素,再比较4<6,把最小的元素4和数据中第四个元素交换位置。最小的元素就排列到第四位了。
第五遍排序:再假设第五个元素是最小元素,比较9>6,把6标记为最小元素,把最小的元素6和数据中第五个元素交换位置。最小的元素就排列到第五位了。排序完成。
算法复杂度:
最差情况:T(n) = O(n^2)
最好情况:T(n) = O(n^2)
原因:因为每一个元素都需要从头到尾循环比较一遍,才能确定最小值(最大值)。
// O(n^2)含义
for(i=0;i<100;i++) {
for(i=0;i<100;i++){
}
}
三)算法源码
算法排序步骤简介:从左到右依次假设最小(最大)元素,然后从剩余数据元素中再查找最小(最大)元素,替换到最左侧。
public static int[] selectionSort(int[] nums) {
if (nums == null) {
return null;
}
for (int i = 0; i < nums.length - 1; i++) {
int minIndex = i; // 假设第一个下标元素为最小值(最大值)
for (int j = i+1; j < nums.length; j++) {
if (nums[minIndex] > nums[j]) {
minIndex = j; // 记录最小(最大)元素的下标位置
}
}
int temp = nums[minIndex]; // 把小的元素替换到前面
nums[minIndex] = nums[i];
nums[i] = temp;
}
return nums;
}
识别二维码关注个人微信公众号
本章完结,待续,欢迎转载!
本文说明:该文章属于原创,如需转载,请标明文章转载来源!