3.简单选择排序
算法思想
每趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止。
步骤
(1)从待排序序列中,找到关键字最小的元素;
(2)如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;
(3)从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束。
图示说明
实现
private static int[] selectSort(int [] array, int low, int high) {
int index=0;
int temp;
int i=low,j;
for(;i<high;i++) {
for(j=i+1;j<=high;j++) {
if(array[index]>array[j]) {
index=j;
}
}
temp=array[index];
array[index]=array[i];
array[i]=temp;
}
return array;
}
简单分析
时间复杂度 O(n^2)
空间复杂度O(1)
不满足稳定排序
优化
思路就是同时从两边选最大值和最小值
实现
private static int[] selectSort2(int []array, int left , int right)
{
int i, min, max;
int temp;
for (; left<right; left++, right--){//一次同时找未排序数组最大值和最小值的下标
min = left;
max = right;
for (i=left; i<=right; i++) {
if (array[i] < array[min]){
min = i;
}
else if (array[i] > array[max]){
max = i;
}
}
if (min != left) //在原地就不交换
{
temp = array[left];
array[left] = array[min];
array[min] = temp;
if (max == left) //如果最大值在最左边,最左边已经存了最小值,所以最大值最新的下标应该是本来最小值的下标
{
max = min;
}
}
if (max != right)
{
temp =array[right];
array[right] = array[max];
array[max] = temp;
}
}
return array;
}