美文网首页
堆排序,二分查找,快速排序

堆排序,二分查找,快速排序

作者: 不积小流_无以成江海 | 来源:发表于2019-03-22 14:10 被阅读0次

创建一个堆

    public static void main(String[] args) {
        int[] arr = new int[]{7,2,6,4,5};
        createHeap(arr, arr.length - 1);
    }

    /**
     * 构建堆
     * @param arr
     * @param lastIndex:最后一个叶子节点的下标
     */
    public static void createHeap (int[] arr, int lastIndex) {
        for (int i = (arr.length / 2) - 1; i >= 0; i--) {
            // 非叶子节点下标
            int top = i;
            while ((top * 2 + 1) <= lastIndex) { // 成立则说明top有 叶子节点

                int left = top * 2 + 1;

                // 节点左右比
                if (left < lastIndex) { // 小于才说明有右节点
                    int right = left + 1;
                    if (arr[left] < arr[right]) {
                        left++;
                    }
                }

                // 节点上下比
                if (arr[left] > arr[top]) {
                    // 交换非叶子节点元素的位置
                    swap(arr, left, top);
                    // 将元素下标赋值,便于之后的非叶子节点调整树结构
                    top = left;
                } else {
                    break;
                }

            }
        }
    }

    /**
     * 交换元素位置
     * @param arr
     * @param i
     * @param j
     */
    public static void swap (int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

二分查找算法

public class Test {
  public static void main(String[] args) {
      // 准备好一个有序的被查找数组
      int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
      // 调用查找方法查找给定数组中5元素所在的索引值,并接收查找到的索引
      int index = getIndex(arr, 5);
      // 输出索引
      System.out.println("index:" + index);
  }

  public static int getIndex(int[] arr, int num) {
      // 定义变量,表示查找数组范围的最左侧,先从0索引开始
      int left = 0; 
      // 定义变量,表示查找数组范围的最右侧,先从最大索引开始
      int right = arr.length - 1;
      // 定义变量,表示查找范围的中间值
      int mid;
      while (left <= right) {
          // 中间索引 = (左侧  + 右侧) / 2
          // mid = (left + right) / 2; 
          // 为了提高效率,我们可以用位运算代替除以运算
          mid = (left + right) >>> 1 
          if (arr[mid] > num) {
              //如果中间元素大于要查找元素,则在中间元素的左侧去找正确元素,最右侧变为mid - 1
              right = mid - 1;
          } else if (arr[mid] < num) {
              //如果中间元素小于要查找元素,则在中间元素的右侧去找正确元素,最左侧变为mid + 1
              left = mid + 1;
          } else {
              // 如果不大不小,那么就正好是找到了,返回找到的索引
              return mid;
          }
      }
      // 当查找范围的最左侧和最右侧重叠后还没有找到元素,则返回-1表示没有找到
      return -1;
  }
}

快速排序

public class QuickSort {
    public static void main(String[] args) {
        int[] arr = {10, 3, 4, 4, 1, 2, 9, 5, 1, 1};
        split(arr, 0, arr.length-1);
        for (int i = 0; i < arr.length; i++) {
            System.out.printf(arr[i] + " ");
        }
    }

    public static void split(int[] arr, int start, int end) {
        if (start > end) {
            return;
        } else {
            int middle = sort(arr, start, end);
            split(arr, start, middle-1);
            split(arr, middle+1, end);
        }

    }

    public static int sort(int[] arr, int start, int end) {
        int base = arr[end];
        while (start < end) {
            while (start < end && arr[start] <= base) {
                start++;
            }
            if (start < end) {
                // start和end交换位置
                int temp = arr[start];
                arr[start] = arr[end];
                arr[end] = temp;
            }
            while (start < end && arr[end] >= base) {
                end --;
            }
            if (start < end) {
                // end和start交换位置
                int temp = arr[end];
                arr[end] = arr[start];
                arr[start] = temp;
            }
        }
        return start;
    }
}

相关文章

  • 排序算法

    准备工作 一、快速排序 二、归并排序 三、堆排序 四、 二分查找 /*二分查找*/ 五、 冒泡排序 /*OC 冒...

  • 排序算法

    冒泡排序 堆排序 插入排序 二分法查找插入排序 希尔排序 快速排序 归并排序

  • algorithm md

    算法思想贪心思想双指针排序快速选择堆排序桶排序荷兰国旗问题二分查找搜索BFSDFSBacktracking分治动态...

  • 常见算法

    单链表反转 冒泡排序 选择排序 插入排序 希尔排序 快速排序 归并排序 堆排序 二分查找 重建二叉树

  • 数据结构与算法-排序/二分查找

    算法中基础中的基础,排序/二分查找 排序 1.快排QuickSort 归并排序 堆排序 1. 二分查找

  • Swift语言实现几个简单算法

    栈队列二分查找插入排序归并排序快速排序 栈 队列 二分查找 二分查找是用于快速查找到目标数据(已排序)的一种查找方...

  • 排序

    目的 方便查找 内排序 交换 冒泡排序 快速排序 选择 直接选择 堆排序 插入 -直接插入 堆排序 基数排序

  • javascript 算法

    快速排序 冒泡排序 二分查找

  • php算法

    冒泡排序 快速排序 二分查找

  • Java实现常见的算法

    主要罗列了常见的选择排序,冒泡排序和快速排序,还有二分查找的算法。 选择排序 冒泡排序 快速排序 二分查找 注意二...

网友评论

      本文标题:堆排序,二分查找,快速排序

      本文链接:https://www.haomeiwen.com/subject/rxnlvqtx.html