排序算法讲解

排序算法:

 

1、冒泡排序:

  for(int i = 0; i < n; i++) { // 每次循环 找到一个最小值
    for(int j = i+1; j < n; j++) { // 寻找最小值

      if(arr[j] < arr[i]) {

        // 交换 i 和 j 对应的值

      }

    }

  }

 

2、插入排序:

  for(int i = 1; i < n; i++) { // 将当前值与前面排好序的值比较,直到找到一个比 i 对应的值小的数

    for(int j = i; j > 0; j--) {

      if( arr[j] > arr[j - 1] ) {

        // 交换 j 和 j - 1 对应的值

      } else {

        break;

      }

    }

  }

3、希尔排序:

  for(int step  = n / 2; step > 0; step /= 2) {

    for(int i = step; i < n; i++) { // 每个步长,进行 插入排序

      for(int j = i; j >= step && arr[j] < arr[j - step]; j -=step) {

        //  交换 j 和 j - step 对应的值

      }

    }

  }

4、快速排序:

  public void quickSort(int[] arr, int start, int end) {

    int temp = arr[start];

    int i = start;

    int j = end;

    while(i < j) {

      while(i < j && arr[j] >= temp) { // 寻找比 temp 小的值

        j--;

      }

      while(i < j && arr[i] <= temp) { // 寻找比 temp 大的值

        i++;

      }

      if( i < j ) { // 如果一次遍历没有结束,则交换值,并继续

        // 交换 i 和 j 对应的值

      }

    }

    // 当一次遍历结束,交换 start 和 i 对应的值

    arr[start] = arr[i];

    arr[i] = temp;

    quickSort(arr, start, i - 1);

    quickSort(arr, i + 1, end);

  }  

 

5、堆排序:数组的索引对应着堆中的广序遍历的索引

  1)首先构建大顶堆:以 n / 2 - 1 (最后一个非叶子节点)开始

  public void buildHeap(int[] arr) {

    for(int i = arr.length / 2 - 1; i >= 0; i--) {

      adjustHeap();

    }

  }

  // 保证以index为根节点的树,父节点比左右节点都大

  public void adjustHeap(int[] arr, int index, int length) {

    int temp = arr[index]; // 当前需要调整的节点值

    int k = index * 2 + 1; // 左子节点

    while( k < length) {

      if( k + 1 < length && arr[k] < arr[k+1]) {

        k++; // 右子节点

      }

      if( arr[k] > temp) {

        arr[index] = arr[k]; // 子节点大于父节点, 将子节点的值赋值给父节点

        index = k; // 将 index 值设置为 子节点, 以当前子节点作为父节点

        k = k * 2 + 1; //  左子节点

      } else {

        break;

      }

    }

    arr[index] = temp;

  }

  2)堆排序

  public void heapSort(int[] arr) {

    buildHeap(arr); // 构建完后的的堆的最大值在第0个,而且父节点肯定比左右子节点都大

    for(int i = arr.length - 1; i > 0; i--) {

      // 交换第 0 个 和 第 i 个值,交换完后,第0个变成小值,需要调整堆,将根节点下面所有的父节点依次向上提,将小值放到最后

      int temp = arr[0];

      arr[0] = arr[i];

      arr[i] = temp;

      adjustHeap(arr, 0, i);

    }

  }      

        

      

  

 

posted @ 2020-11-04 18:52  韩冬冬  阅读(87)  评论(0编辑  收藏  举报