力扣——排序数组

116 阅读2分钟

TypeScript 实现快速排序和归并排序,代码示例:

1、快速排序
function quickSort(arr: number[]): number[] {  
  if (arr.length <= 1) {  
    return arr;  
  }
  
  const pivotIndex = Math.floor(arr.length / 2);  
  const pivot = arr[pivotIndex];  
  const left = [];  
  const right = [];  
  
  for (let i = 0; i < arr.length; i++) {  
    if (arr[i] < pivot) {  
      left.push(arr[i]);  
    } else {  
      right.push(arr[i]);  
    }  
  }  
  
  return [...quickSort(left), pivot, ...quickSort(right)];  
}

快速排序的实现过程是选取一个基准值,将数组分成两部分,递归地对这两部分进行排序,最后将它们合并起来。归并排序的实现过程是将数组分成两部分,递归地对这两部分进行排序,然后将它们合并起来,得到一个有序的数组。

2、归并排序
function mergeSort(arr: number[]): number[] {  
  if (arr.length <= 1) {  
    return arr;  
  }  
  
  let middle = Math.floor(arr.length / 2);  
  let left = arr.slice(0, middle);  
  let right = arr.slice(middle);  
  
  return merge(mergeSort(left), mergeSort(right));  
}  
  
function merge(left: number[], right: number[]): number[] {  
  let result = [];  
  
  let i = 0;  
  let j = 0;  
  let k = 0;  
  
  while (i < left.length && j < right.length) {  
    if (left[i] <= right[j]) {  
      result.push(left[i]);  
      i++;  
    } else {  
      result.push(right[j]);  
      j++;  
    }  
  }  
  
  while (i < left.length) {  
    result.push(left[i]);  
    i++;  
  }  
  
  while (j < right.length) {  
    result.push(right[j]);  
    j++;  
  }  
  
  return result;  
}  
  
// 示例  
const unsortedArray = [3, 6, 1, 8, 2, 10, 9, 5, 4];  
const sortedArray = mergeSort(unsortedArray);  
  
console.log(sortedArray); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

定义了一个名为 mergeSort 的函数,该函数接受一个数字数组作为参数,并返回一个排序后的数组。如果数组的长度小于等于 1,则直接返回该数组。否则,我们将数组分成两个子数组,并递归调用 mergeSort 函数对子数组进行排序,将排序后的两个子数组合并为一个排序后的数组。

在 merge 函数中,我们创建了一个新数组,用于存储合并后的数组。我们使用三个指针 ij 和 k 分别指向左子数组、右子数组和结果数组的开头。然后,我们比较左子数组和右子数组的第一个元素,并将较小的元素添加到结果数组中,将剩余的元素添加到结果数组中。