JS排序算法

117 阅读1分钟

1. 冒泡排序:从左到右依次进行对比,大的在右边

function maopao (data) {
  const len = data.length;
  for (let i = 0; i < len; i++) {
    for (let j = 1; j < len-i; j++) {
      if (data[j]<data[j-1]) {
        [data[j-1],data[j]]=[data[j],data[j-1]]
      }
    }
    
  }
  return data;
}

2. 选择排序:选择最小值交换

function xuanze (data) {
  const len=data.length
  for (let i = 0; i < len-1; i++) {
    let minIndex = i;
    for (let j = i+1; j < len; j++) {
      if (data[j]<data[minIndex]) {
        minIndex = j;
      }
    }
    if (minIndex !== i) {
      [data[i], data[minIndex]] = [data[minIndex], data[i]]
    } 
  }
  return data;
}

3. 插入排序:假设有序,然后对比

  const len = data.length;
  for (let i = 1; i < len; i++) {
    let k = i;
    for (let j = i - 1; j > -1; j--) {
      if (data[j] > data[i]) {
        k = j;
      }
    }
    [data[k],data[i]]=[data[i],data[k]]
  }
  return data;
}

4. 快速排序:二分法排序

function kuaisu (data) {
  const len = data.length;
  if (len === 0) return [];
  let tmp = data[0],lesser=[],greater=[];
  for (let i = 1; i < len; i++) {
    if (data[i] < tmp) {
      lesser.push(data[i]);
    } else {
      greater.push(data[i]);
    }
  }
  return kuaisu(lesser).concat(tmp, kuaisu(greater));
  
}

5. 希尔排序:插入排序的基础上,间隔监测

function xier (data) {
  let len = data.length;
  // gap 即为增量
  for (let gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) {
    for (let i = gap; i < len; i++) {
      let j = i;
      let current = data[i];
      while(j - gap >= 0 && current < data[j - gap]) {
        data[j] = data[j - gap];
        j = j - gap;
      }
      data[j] = current;
      console.log(gap,data);
    }
  }
}
// [11, 2, 18, 44][1, 3, 5]
// // 11, 44, 5 2, 1 18, 3
// [5, 1, 3, 11, 2, 18, 44]

// 归并排序:(待补充)

const data = [11, 2, 18, 44, 1, 3, 5,9];

console.log(charu(data));