为何我的归并排序(Merge Sort)无法实现降序排序?
问题原因及修复方案
你的降序排序失效核心有两个问题:
- merge函数的比较逻辑未区分排序方向:当前代码里的
left[0][prop] < right[0][prop]是固定的升序比较逻辑,完全没用到ord参数调整排序方向 - 返回结果未对应排序方向调整:不管升序还是降序,你返回的都是同一个拼接数组,没有根据排序需求改变顺序
修复后的完整代码
function mergeSort(arr, prop, ord){ if(arr.length <= 1){ return arr; } let mid = Math.floor(arr.length / 2); let left = mergeSort(arr.slice(0, mid), prop, ord); let right = mergeSort(arr.slice(mid), prop, ord); return merge(left, right, prop, ord); } function merge(left, right, prop, ord){ let newArr = []; while(left.length && right.length){ // 根据排序方向动态调整比较逻辑 const shouldTakeLeft = ord === 'asc' ? left[0][prop] < right[0][prop] : left[0][prop] > right[0][prop]; if(shouldTakeLeft){ newArr.push(left.shift()); }else{ newArr.push(right.shift()); } } // 排序逻辑已在比较阶段处理,直接拼接剩余元素即可 return [...newArr, ...left, ...right]; }
验证效果
调用mergeSort(data, 'motor', 'desc')后,数组会按motor字段降序排列,输出结果如下:
[ { color: 'C', motor: 15, ... }, { color: 'B', motor: 12, ... }, { color: 'D', motor: 11, ... }, { color: 'A', motor: 10, ... } ]
内容的提问来源于stack exchange,提问作者Eduardo
相关产品推荐
相关产品推荐

