2021/9/21(希尔排序 + 快速排序)

2021/9/21(希尔排序 + 快速排序)

简单插入排序存在的问题:

当存在这样一个数组:

Arr = {2,3,4,5,6,1}

当需要插入的数是较小的数时,这是需要移动次数非常多!
插入排序代码:

/**
     * insertVal 是即将要进行插入的值
     * index 是有序表中最后一个值的下标
     * @param arrays
     */
// 第二种解决方案 , 这个才是真的插入操作 最优解法
public static void insert2(int[] arrays){
  int insertVal = 0;
  int index = 0;
  int length = arrays.length;
  for (int i = 1; i <= length-1; i++) {
    // 准备插入的数
    insertVal  = arrays[i];
    // 表示与有序表的最后元素的下标
    index = i-1;
    // 如果插入的数比被插入的数小
    while (index>=0 && insertVal<arrays[index]){
      arrays[index+1] = arrays[index];
      index--;
    }
    // //把插入的数放入合适位置
    arrays[index+1] = insertVal;
  }
}

希尔排序介绍

1959年提出的排序算法,是简单插入排序进过改进之后的一个更高效的版本。也称缩小增量排序

当然shell排序也是插入排序

// 总体代码实现
public static void shellSort(int []array){
  int temp = 0;
  int index = 0;
  int length = array.length;
  // 步长
  int gap = length/2;
  while (gap >0){
    for (int i = gap; i < length; i++) {
      temp = array[i];
      index = i - gap;
      while (index>=0 && temp<array[index]){
        array[index+gap] = array[index];
        index-=gap;
      }
      array[index+gap] =temp;
    }
    gap /=2;
  }
}

快速排序

快排,面试最喜欢问的排序算法。这是运用分治法的一种排序算法。

快速排序,说白了就是给基准数据找其正确索引位置的过程.

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

空间换时间 快

在上一篇有发具体的快排原理与代码。

posted @ 2021-09-22 09:23  能借我十块钱吗  阅读(29)  评论(0编辑  收藏  举报