直接选择是简单排序,算法思想是从第一个数字开始,与后面的每个数字进行比较,如果该数字小了,那么就把两数进行交换,这样一轮下来第一个数字肯定是最小的数字,然后第二个数字开始与后面的数字进行比较,思想是一样的,这样的话,第二小的数字就到了第二个位置,这样依次类推,排序就完成了。
来举一组例子:
这样一组数字进行选择排序
- 先拿到第一个数字5,然后与4进行比较,发现4小,然后5和4进行交换
- 然后现在4就变成了选中数字,继续进行比较,和1进行比较发现1小
- 这样1变成了选中数字,再与7比较发现不用交换,陆续与6,4,3,2比较都不用交换,这样我们的第一趟就完成了,我们可以发现,第一躺完成了以后第一个位置就是最小的数字,然后我们选中第二个位置5,与后面进行比较,完成第二趟排序
第二个小的数字就变到了第二个位置,这样依次类推就完成了选择排序
代码实现
public static void selectSort(int[] array) {
int temp = 0;
for (int i = 0; i < array.length-1; i++) {
for (int j = i+1; j < array.length; j++) {
if(array[i] > array[j]) {
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
}
选择排序是选中一个位置,然后不停的与后面的所有位置进行交换,是跳跃交换的,所以是不稳定的
特点:
不稳定
选择排序不论在何种情况下,都不会break跳出循环,所以它的最优最坏和平均时间复杂度都为O(n2)
最优时间复杂度:
O(n2)
最坏时间复杂度:
O(n2)
平均时间复杂度:
O(n2)
选择排序直接进行交换,不依赖数组,所以空间复杂度为O(1)
空间复杂度:
O(1)