选择排序与冒泡排序的使用很少,但依旧经典。
1.选择排序(慢,不稳定)
//选择排序(时间复杂度为N**2,空间为1,不稳定)
//每次找到最小的放在最前面,每次循环比较n次,换一次
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
minIndex = arr[j] < arr[minIndex] ? j : minIndex;
}
swap(arr, i, minIndex);
} //选择排序的优化
//每次循环找到一个最大的和最小的
//将最大的放在数组最后面,最小的放在前面;
//*************************
//交换的时候需要注意:1.先交换最小值,
// 2.若max存的值为数组最前面,则跟交换后的min互换
//即:若max=j;swap(a,max,min) 因为min与j已经互换位置了,需要重定向
for(int j=0;j<a.length;j++){
int max = a.length-j-1;
int min = j;
for (int i = j; i < a.length-j; i++) {
if (a[min] > a[i]) min = i;
if (a[max] < a[i]) max = i;
}
//两组数的交换
swap(a,min,j);
if(max!=j){ //否则正常交换
swap(a,max,a.length-j-1);
//如果max==j,先将min和j交换后,max需与min交换
}else{swap(a,min,a.length-j-1);}
} 2.冒泡排序(慢,稳定)
//冒泡排序(时间复杂度为N**2,空间为1,稳定)[最好情况能达到n]
//每次找到最大的放在最后面,每次循环比较n次,换k次
//循环次数,排从尾到第二个的数 n
for (int j=a.length-1;j>0;j--) {
//一次循环 n
for (int i=0;i<a.length-1;i++) {
if (a[i] > a[i+1]) swap(a,i,i+1);
}
} //改进版冒泡,最快达到n,已排好情况下,发现一次没换直接返回
int k=0;
for(int j=a.length;j>0;j--)
{
for (int i = 0; i < j - 1; i++) {
if (a[i] > a[i + 1]) {
swap(a, i, i + 1);
k++;
}
}
if (k==0) break;
} 
京公网安备 11010502036488号