- 原理:从无序区间中找到最大(最小)的元素,将其放于无序区间的后面(前面),直到所有无序区间内的元素排完后,排序结束
- 插入排序是一个不稳定的排序
实现方式- 单向选择排序
- 遍历无序区间选择出最大的值,放在无序列表的后面
- 代码:
public void selectSort(int[] array) {
for(int i = 0; i < array.length - 1; i++) {
//无序区间是[0, array.length - i)
//有序区间是[array.length - i, array.length)
int max = 0;
for(int j = 0; j < array.length - i; j++) {
if(array[j] > array[max]) {
max = j;
}
}
int tmp = array[max];
array[max] = array[array.length - 1 - i];
array[array.length - 1 - i] = tmp;
}
}
双向选择排序 - 遍历无序区间,找出无序区间中的最大值和最小值,将最小值放在无序区间的前面,将最大值放在无序区间的后面,直到将无序区间的元素都排完
代码: public void selectSortOP(int[] array) {
int left = 0;
int right = array.length - 1;
while(left <= right) {
int min = left;
int max = left;
//遍历无序区间,找到最大值和最小值的下标
for(int i = left + 1; i <= right; i++) {
if(array[i] > array[max]) {
max = i;
}
if(array[i] < array[min]) {
min = i;
}
}
swap(array, min, left);
//判断最大的值是否在最左侧,如果是在最左侧的话由于最小的元素已经和他进行了交换,此时最大值的下标就
//不再是left,而是交换后的min
if (max == left) {
max = min;
}
swap(array, max, right);
left++;
right--;
}
}
private void swap(int[] array, int i, int j) {
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
性能分析- 时间复杂度:O(N^2)
- 空间复杂度:O(1)
- 稳定性:不稳定
|