zoukankan      html  css  js  c++  java
  • 排序算法讲解

    排序算法:

    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);

        }

      }      

            

          

      

  • 相关阅读:
    CodeForces Round #556 Div.2
    #Leetcode# 650. 2 Keys Keyboard
    #Leetcode# 552. Student Attendance Record II
    #Leetcode# 551. Student Attendance Record I
    #Leetcode# 522. Longest Uncommon Subsequence II
    牛客OI周赛9-普及组
    最长回文子序列 (模板)
    C++ 各种排序算法总结
    THU 数据结构 真二叉树重构(Proper Rebuild)
    C++中结构体函数的实现
  • 原文地址:https://www.cnblogs.com/handongdong/p/13927457.html
Copyright © 2011-2022 走看看