选择排序按照动画效果来看应该只记录最小的索引,最后在内层循环结束后再交换数值

来源:5-9 缺失的第一个正数(2)

布衣小酱

2019-04-06

发现老师在选择排序的时候,发现了最小值就要交换两个数字,在观看动画效果和网上查找资料后,发现在内层循环时,只记录最小值所在的索引即可,内层循环结束后,再交换。附上修改后的本题代码

export default (arr) => {
  arr = arr.filter(item => item > 0)
  // 实现选择排序,先拿到最小值,如果第一个元素不是1直接返回1,如果是1,就要比相邻元素差值
  for (let i = 0, len = arr.length, min; i < len; i++) {
    min = i
    for (let j = i + 1; j < len; j++) {
      if (arr[j] < arr[min]) {
        min = j
      }
    }
    if (min !== i) {
      let tmp = arr[i]
      arr[i] = arr[min]
      arr[min] = tmp
    }

    if (i > 0) {
      if (arr[i] - arr[i - 1] > 1) {
        return arr[i - 1] + 1
      }
    } else {
      if (arr[i] !== 1) {
        return 1
      }
    }
  }
  return arr.length ? arr.pop() + 1 : 1
}
写回答

2回答

东方既白233

2019-05-08

void swap(int *a,int *b) //交換兩個變數{
    int temp = *a;
    *a = *b;
    *b = temp;}void selection_sort(int arr[], int len) {
    int i,j;

	for (i = 0 ; i < len - 1 ; i++) 
    {
		int min = i;
		for (j = i + 1; j < len; j++)     //走訪未排序的元素
			if (arr[j] < arr[min])    //找到目前最小值
				min = j;    //紀錄最小值
	   	swap(&arr[min], &arr[i]);    //做交換
	}}

https://zh.wikipedia.org/wiki/%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F


维基百科的标准答案,同学你的理解没有错

1
0

快乐动起来呀

2019-04-08

感觉你没有把课程的选择排序理解正确

0
2
_小_七_
回复
东方既白233
动画确实是交换下标,维基百科也是对的,一般是交换下标,最后根据下标拿到值,而老师那样是直接交换值,在最后就赋值就行了,都是对的,两者都是选择排序,中心思想都是找最小值替换到当前循环的第一个元素
2020-02-06
共2条回复

JavaScript版 数据结构与算法

填补前端同学的算法短板,掌握面试中最常见的算法与数据结构

2467 学习 · 395 问题

查看课程