一、直接选择排序
原理:
每一次从无序区间选出最大(或最小)的一个元素,存放在无序区间的最后(或最前),直到全部待排序的数据元素排完 。
代码实现:
public void selectSort(int[] arr) {
for(int i = 0;i < arr.length;i++) {
int maxPos = 0;
for(int j = 1;j < arr.length - i;j++) {
if(arr[j] > arr[maxPos]) {
maxPos = j;
}
}
if(arr.length - i !=maxPos) {
swap(arr,maxPos,arr.length-1-i);
}
}
}
public void swap(int[] array,int left,int right) {
int tmp = array[left];
array[left] = array[right];
array[right] = tmp;
}
性能分析:
稳定性:不稳定
int[] array = {2,3,4 1,7,5a,5b,3};
// 交换中该情况无法识别,保证 5a 还在 5b 前边
二、双向选择排序
原理:
每一次从无序区间选出最小 + 最大的元素,存放在无序区间的最前和最后,直到全部待排序的数据元素排完 。
代码实现:
public void selectSortOP(int[] array) {
int begin = 0;
int end = array.length-1;
while(begin < end) {
int maxPos = begin;
int minPos = begin;
int index = begin + 1;
while(index <= end) {
if(array[index] > array[maxPos]) {
maxPos = index;
}
if(array[index] < array[minPos]) {
minPos = index;
}
index++;
}
if(maxPos != end ) {
swap(array,maxPos,end);
}
if(array[minPos] < array[begin] && minPos != begin) {
swap(array,minPos,begin);
}
begin++;
end--;
}
}
public void swap(int[] array,int left,int right) {
int tmp = array[left];
array[left] = array[right];
array[right] = tmp;
}
与直接选择排序的不同之处:
双向选择排序比直接选择排序的循环次数少了一半,每次排序了两个元素,性能更好。