问题描述
- 选择排序这两种有什么不同,注意粗体部分
- public static void sort(Comparable[] a)
{ // 将a[] 按升序排列
int N = a. length; // 数组长度
for (i nt i = 0; i < N; i ++)
{ // 将a[i ] 和a[i +1. . N] 中最小的元素交换
int min = i ; // 最小元素的索引
for (int j = i +1; j < N; j ++)
if (l ess(a[j ] a[mi n] ) ) mi n = j ;
exch(a i mi n) ;
}
}
// l ess() 、 exch() 、 i sSorted() 和mai n() 方法见“排序算法类模板”
public static void selectionSort(int[] a)
{
int len = a.length;
for (int i=0; i<**len-1**; i++)
{
int min = i;
for (int j=i+1; j {
if (a[min] > a[j])
min = j;
}
int t = a[min];
a[min] = a[i];
a[i] = t;
}
}
解决方案
for (int j=i+1; j {
if (a[min] > a[j])
min = j;
}
这语句写得有问题,重新截个图上传上来
解决方案二:
public static void selectionSort(int[] a)
{
int len = a.length;
for (int i=0; i<**len-1**; i++)
{
int min = i;
for (int j=i+1; j {
if (a[min] > a[j])
min = j;
}
int t = a[min];
a[min] = a[i];
a[i] = t;
}
}
第二种
解决方案五:
这两方法是一样的,都说明了选择排序的思想,也都能实现,但第二种方法selectionSort(int[] a)更能说明算法思想,比较n个数所需要遍历的次数为n-1(比如说4和3两数比较,只需一次就可比较出来),所以遍历的范围就是0~n-2,那么外部for循环应该是i < n-1,内部循环应该是j < n,因为选择排序是从所需比较的下一个数开始寻找最小值,遍历范围为(i+1)~n-1;第一种方法外部循环使用的是i < N 是因为当i=n-1时,内部循环j的值为n,n< n不成立,内部循环也会退出,但多了一次判断,而第二种方法就不会多一次判断了,所以我觉得第二种方法更好。
解决方案六:
没区别 下面的循环少执行一次判断 length-1 这个值没比较进入小循环
但是都是 o(n^2)的复杂度 这个是已很low的解决方案 归并排序 堆排序 快速排序 都是 o(nlogn)的时间界, 这些排序算法 才值得看