开始学习算法的知识,先从排序开始吧,小白勿喷,欢迎交流
下面的代码是选择排序,先从开头开始,依次选出它之后的最小的,如果比它小,就交换他们之间的位置。依次类推,算法的时间复杂度是O(N^2),空间复杂度是O(1),不稳定。
图片的直观展示是:
代码的实现是:
public static void main(String[] args) {
int[] nums = new int[]{2,1,5,1,3,7};
selectionSort(nums);
for (int i = 0; i < nums.length; i++){
System.out.println(nums[i]);
}
}
public static void selectionSort(int[] arr){
//过滤一些数组
if(arr == null || arr.length < 2){
return;
}
//核心代码,后面的依次进行比较,如果小于就更新最小的索引值
for(int i = 0; i < arr.length; i++){
int minIndex = i;
for(int j = i + 1; j < arr.length; j++){
minIndex = arr[j] < arr[minIndex] ? j : minIndex;
}
//将后面最小的交换到前面,这一步骤导致了不稳定
swap(arr, i, minIndex);
//进行下一轮
}
}
public static void swap(int[] arr, int i, int j){
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
不稳定性的例子:
5 8 5 2 9,第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。