循环不变量定义
老师,我觉得第二种实现选择排序的方法中应该是:arr(i, n)有序,arr[0, i]无序。
我觉得您实现的代码是这个意思。
而不是上课讲的:arr[i, n)有序,arr[0, i)无序。
不知道我想的对不对。
29
收起
正在回答
3回答
你是指这一小节的代码吗?
是的呀,这一小节的代码就是 arr[i, n)有序,arr[0, i)无序 呀。所以是换个方式实现选择排序呀。再仔细看一看上一小节的作业?
继续加油!:)
假蛙工程师
2022-04-20 17:58:22
循环不变量不同,逻辑代码也不同
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | public static <E extends Comparable<E>> void sort(E[] arr) { // arr[0,i)已排序,arr[i, n)未排序 for ( int i = 0 ; i < arr.length; i ++) { int minIndex = i; for ( int j = i; j < arr.length; j++) { if (arr[j].compareTo(arr[minIndex]) < 0 ) { minIndex = j; } } swap(arr, minIndex, i); } } private static <E> void swap(E[] arr, int i, int j) { E temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static <E extends Comparable<E>> void sort2(E[] arr) { // arr[0,i) 无序的,arr[i,n)有序的 for ( int i = arr.length; i > 0 ; i --) { int maxIndex = i - 1 ; for ( int j = i - 1 ; j >= 0 ; j --) { if (arr[j].compareTo(arr[maxIndex]) > 0 ) { maxIndex = j; } } swap(arr, i - 1 , maxIndex); } } public static <E extends Comparable<E>> void sort3(E[] arr) { // arr[0,i]是无序的,arr(i,n)是有序的 for ( int i = arr.length - 1 ; i >= 0 ; i --) { int maxIndex = i; for ( int j = i; j >= 0 ; j --) { if (arr[j].compareTo(arr[maxIndex]) > 0 ) { maxIndex = j; } } swap(arr, i , maxIndex); } } |
假蛙工程师
2021-10-16 10:49:10
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 老师的实现代码: // 换个方法实现选择排序法,我们叫 sort2 public static <E extends Comparable> void sort2(E[] arr){ for ( int i = arr.length - 1 ; i >= 0 ; i --){ // 选择 arr[0...i] 中的最大值 int maxIndex = i; for ( int j = i; j >= 0 ; j --){ if (arr[j].compareTo(arr[maxIndex]) > 0 ) maxIndex = j; } swap(arr, i, maxIndex); } } |
我和题主的想法一样,循环变量应该是arr[0, i]未排序,arr(i, n)已排序。
d
在第一次进入训循环时, i = arr.length - 1 即 i = n - 1; 显然应该是arr(n - 1, n) 已排序,这是个空集合。
如果是arr[n-1, n)有序,就是说,还没开始排序,就存在部分元素是有序的,语义不通啊。
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧