选择排序:
第一轮用第一个元素与后面的所有元素比较找到最小的那一个与第一个元素交换位置,如果没找到则不交换。 第二轮用第二个元素进行类似第一轮的操作,如此类推。
复杂度分析:
与冒泡排序一样,但是交换次数少于冒泡排序。
比较次数n*(n-1)/2 次
时间复杂度:O(n^2)
选择排序代码:
public static int[] SelectSort(int arr[],int len)
{
int k = 0;//保存无序区第一个元素下标,同时记录最小元素的下标
for (int i = 0; i < len - 1; i++){
k = i;
for (int j = i + 1; j < len; j++){
if (arr[j] < arr[k]){
k = j;
}
}
//如果k就是最小的则不用交换
if (i != k){
int tmp = arr[k];
arr[k] = arr[i];
arr[i] = tmp;
}
}
return arr;
}
优化:确定双值
同时记录最大和最小两个值, 放到最前,最后
public static int[] SelectSort1(int arr[],int len)
{
int left = 0;
int right = len - 1;
while (left < right)
{
int max = left;//记录无序区最大元素下标
int min = left;//记录无序区最小元素下标
for (int j = left; j <= right; j++){
//找最大元素下标
if (arr[j] < arr[min]){
min = j;
}
//找最小元素下标
if (arr[j]>arr[max]){
max = j;
}
}
//最小值如果是第一个则没有必要交换
if (min != left){
int tmp = arr[left];
arr[left] = arr[min];
arr[min] = tmp;
}
//如果最大元素下标是left,但是前面已经和最小元素交换了,则此时最大元素下标应该是min
if (max == left){
max = min;
}
//如果max就是最小的则不用交换
if (max != right){
int tmp = arr[right];
arr[right] = arr[max];
arr[max] = tmp;
}
left++;
right--;
}
return arr;
}