算法与数据结构练习中常犯错误3——排序、查找

代码实现参见github/algorithm中各个类别下wz包中的代码。

2.算法中常犯错误

2.1 插入排序——稳定排序

  • 39)少了对数据索引范围的检查
  • 40)同堆中siftUp siftDown一样,循环外的赋值出错了
            while (j >= 0 && e < array[j]) {
                array[j + 1] = array[j];
                j--;
            }
            // 这里之前赋值错写成了array[j] = e
            array[j + 1] = e;

2.2 希尔排序

  • 41)while循环常犯的错误,三要素中忘了更新推进循环的变量
                while (j >= 0 && e < array[j]) {
                    array[j + increment] = array[j];
                    // 忘了更新j
                    j -= increment;
                }

2.3 冒泡排序——稳定排序

2.4 选择排序

2.5 归并排序——稳定排序

2.6 快速排序

  • 42)递归算法,缺少终止条件
    private void sortCore(int left, int right) {
        // 注意,递归解法都有终止条件,千万不要缺少!
        if (right - left  <= 0) {
            return;
        }
  • 43)for循环中i变量的初始状态不要想当然写成i = 0
    private int partition(int left, int right) {
        int mid = array[right];
        // less指向左边小于mid子数组最后索引的下一个
        // 这里注意less起始地址是left不是0
        int less = left;
        for (int i = left; i <= right - 1; i++) {
            // 算法导论的版本是<=,将小于等于的都放在左边
            if (array[i] <= mid) {
                swap(less++, i);
            }
        }

2.7 三向快速排序+三向字符串快速排序

  • 44)长度、索引检测
        // 这里犯了严重错误,只有长度允许,才继续
        if (v.length() > d + 1) {
            sort2(low, high, d + 1);
        }
  • 45)>=与>的区别
    private boolean less(String a, String b, int d) {
        for (int i = d; i < Math.min(a.length(), b.length()); i++) {
            // 犯了小错误,这里应该是charAt(i)而不是charAt(d)
            if (a.charAt(i) < b.charAt(i)) {
                return true;
            } else if (a.charAt(i) > b.charAt(i)) {
                // 这个地方刚开始写错了,写成了>=,应该是>,等于则必须向后
                return false;
            }
        }
  • 总结:对于while循环,核心就是循环不变量,清晰定义循环不变量中各个变量表示的含义,以及循环不变量的状态是什么

2.8 堆排序

2.9 计数排序

2.10 字符串的低位优先排序

2.11 高位优先排序

  • 46)索引检查
        // 少了索引检测
        checkValid(low, high);
        if (high - low + 1 <= MIN_LENGTH) {
            insertionSort(low, high, d);
            // 少了return
            return;
        }

2.12 外排序——多路归并排序

2.13 二分查找

2.14 查找第k个数

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 查找和排序都是程序设计中经常用到的算法。查找相对而言较为简单,不外乎顺序查找、二分查找、哈希表查找和二叉排序树查找...
    eagleRock阅读 5,613评论 0 14
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 5,979评论 0 13
  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 1,377评论 0 1
  • 该系列文章主要是记录下自己暑假这段时间的学习笔记,暑期也在实习,抽空学了很多,每个方面的知识我都会另起一篇博客去记...
    Yanci516阅读 12,282评论 6 19
  • 从6月16回的老家(原因嘛……),丢下娃一个人回去了。回到县城的家住了几天,就直奔乡下的几十亩杉树林地去了,今年种...
    xiu二丫阅读 925评论 0 1