当前位置: 首页 > news >正文

经典排序算法及其 Java 实现

「博客搬家」 原地址: 简书 原发表时间: 2017-08-17

网上有很多排序算法的总结,不过有很多缺点,比如有些根本就是错的,无法通过测试用例,有些过于冗长。所以我总结了一套短小精悍的 Java 实现,经测试,该套实现可通过牛客网的关于此的所有测试用例。

1. 冒泡排序

public class BubbleSort implements KySort {
    public void kySort(int[] a, int size) {
        for (int i = 0; i < size - 1; i++) {
            for (int j = 0; j < size - i - 1; j++) {
                if (a[j] > a[j + 1]) {
                    swap(a, j, j + 1);
                }
            }
        }
    }
}

2. 插入排序

public class InsertSort implements KySort {
    public void kySort(int[] a, int size) {
        for (int i = 1; i < size; i++) {
            int temp = a[i];
            int j = i;
            while (j > 0 && a[j - 1] > temp) {
                a[j] = a[j - 1];
                j--;
            }
            a[j] = temp;
        }
    }
}

3. 选择排序

public class SelectSort implements KySort {
    public void kySort(int[] a, int size) {
        for (int i = 0; i < size - 1; i++) {
            int min = i;
            for (int j = i + 1; j < size; j++) {
                if (a[j] < a[min]) {
                    min = j;
                }
            }
            if (i != min) {
                swap(a, i, min);
            }
        }
    }
}

4. 堆排序

public class HeapSort implements KySort {
    public void kySort(int[] a, int n) {
        for (int i = n / 2; i >= 0; i--) {
            heapAdjust(a, i, n - 1);
        }
        for (int i = n - 1; i > 0; i--) {
            swap(a, 0, i);
            heapAdjust(a, 0, i - 1);
        }
    }

    /**
     * @param index 父节点索引
     * @param n     尾节点索引
     */
    private void heapAdjust(int[] a, int index, int n) {
        int temp = a[index];
        for (int child = index * 2 + 1; child <= n; child = index * 2 + 1) {
            if (child < n && a[child] < a[child + 1]) {
                child++;
            }
            if (temp > a[child]) break;
            a[index] = a[child];
            index = child;
        }
        a[index] = temp;
    }
}

5. 归并排序

public class MergeSort implements KySort {
    public void kySort(int[] a, int size) {
        sort(a, 0, size - 1, new int[a.length]);
    }

    private void sort(int[] a, int left, int right, int[] temp) {
        if (left >= right) return;
        int mid = (left + right) / 2;
        sort(a, left, mid, temp);
        sort(a, mid + 1, right, temp);
        merge(a, left, mid, right, temp);
    }

    private void merge(int[] a, int left, int mid, int right, int[] temp) {
        int k = left;
        int i = left;
        int j = mid + 1;

        while (i <= mid && j <= right) {
            if (a[i] < a[j]) {
                temp[k++] = a[i++];
            } else {
                temp[k++] = a[j++];
            }
        }
        while (i <= mid) {
            temp[k++] = a[i++];
        }
        while (j <= right) {
            temp[k++] = a[j++];
        }

        while (left <= right) {
            a[left] = temp[left];
            left++;
        }
    }
}

6. 快速排序

public class QuickSort implements KySort {
    @Override
    public void kySort(int[] a, int size) {
        quickSort(a, 0, size - 1);
    }

    private void quickSort(int[] a, int left, int right) {
        if (right - left < 2) {
            if (a[left] > a[right])
                swap(a, left, right);
            return;
        }
        int p = middleBy3(a, left, right);

        quickSort(a, left, p - 1);
        quickSort(a, p + 1, right);
    }

    private int middleBy3(int[] a, int left, int right) {
        int p = (left + right) / 2;
        int end = right;

        if (a[left] > a[p]) swap(a, left, p);
        if (a[left] > a[right]) swap(a, left, right);
        if (a[p] > a[right]) swap(a, p, right);

        int temp = a[p];
        swap(a, p, right);

        while (true) {
            while (a[++left] < temp) ;
            while (a[--right] > temp) ;
            if (left >= right) break;
            else swap(a, left, right);
        }
        swap(a, left, end);
        return left;
    }
}

7. 附录

7.1 交换方法

public class Util {
    public static void swap(int[] a, int i, int j) {
        int k = a[i];
        a[i] = a[j];
        a[j] = k;
    }
}

7.2 基于策略模式的主程序实现

public class SortMain {
    private static KySort sorter;
    private int[] a;//定义一个数组

    private SortMain(int... values) {   //构造函数
        a = values;
    }

    public static void main(String[] args) {
        setSorter(new QuickSort());
        SortMain arr;
        arr = new SortMain(5, 4, 3, 2, 1, 0);
        arr.display();
        arr.kySort();
        arr.display();
        System.out.println("--------");
        arr = new SortMain(54, 35, 48, 36, 27, 12, 44, 44, 8, 14, 26, 17, 28);
        arr.display();
        arr.kySort();
        arr.display();
        System.out.println("--------");
        arr = new SortMain(32, 103, 24, 88, 95, 70, 97, 15, 102, 6, 79, 46, 51, 37, 93, 108, 9, 58, 53, 58, 79, 36, 58, 91, 78, 58, 61, 81);    //初始化数组
        arr.display();
        arr.kySort();
        arr.display();
    }

    private static void setSorter(KySort sorter) {
        SortMain.sorter = sorter;
    }

    private void display() {
        for (int i : a) {   //遍历数组中每一个元素
            System.out.print(i + " ");   //展示
        }
        System.out.println();
    }

    private void kySort() {
        sorter.kySort(a, a.length);
    }
}

相关文章:

  • Linux三剑客--awk
  • 迭代器、生成器、面向过程编程
  • 16、bash编程之数组介绍、及bash内置字符串处理工具介绍
  • 高德地图开发汇总
  • 使用Context创建一个View需要注意的地方
  • Android爬坑之旅之FileProvider(Failed to find configured root that contains)
  • Java常用工具类之自定义访问对象
  • windows代理
  • unity3d GUITexture不显示问题
  • 微信小程序之 Index(仿淘宝分类入口)
  • Jerry的CRM Middleware(中间件)文章合集
  • 一些网址
  • 原生JS实现百度搜索功能
  • JavaScript:(a==1 a==2 a==3)能输出true么?
  • 阿里云启动API创新大赛 资源编排技术为场景赛题
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【技术性】Search知识
  • classpath对获取配置文件的影响
  • Elasticsearch 参考指南(升级前重新索引)
  • emacs初体验
  • github指令
  • Laravel Mix运行时关于es2015报错解决方案
  • nginx 配置多 域名 + 多 https
  • vue-router 实现分析
  • vue的全局变量和全局拦截请求器
  • Vue--数据传输
  • 从零开始在ubuntu上搭建node开发环境
  • 大快搜索数据爬虫技术实例安装教学篇
  • 后端_ThinkPHP5
  • 聊聊flink的TableFactory
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 优化 Vue 项目编译文件大小
  • - 转 Ext2.0 form使用实例
  • 大数据全解:定义、价值及挑战
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #define,static,const,三种常量的区别
  • #每天一道面试题# 什么是MySQL的回表查询
  • (C语言)球球大作战
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (三)docker:Dockerfile构建容器运行jar包
  • (译) 函数式 JS #1:简介
  • (转载)PyTorch代码规范最佳实践和样式指南
  • (转载)深入super,看Python如何解决钻石继承难题
  • .naturalWidth 和naturalHeight属性,
  • .Net 垃圾回收机制原理(二)
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .net连接oracle数据库
  • @Bean, @Component, @Configuration简析
  • @RequestMapping用法详解
  • [ 蓝桥杯Web真题 ]-布局切换
  • [ 手记 ] 关于tomcat开机启动设置问题