八大排序算法的java实现

有时间再贴算法分析图

JDK7的Collections.sort()的算法是TimSort, 适应性的归并排序, 比较晦涩难懂, 这里没有实现

public class mySort {// 冒泡排序public static void myBubbleSort(int[] array) {int lastExchange = array.length - 1;    //记录最后交换位置, 避免重复比较for (int i = lastExchange - 1; i >= 0; --i) {for (int j = 0; j <= i; ++j) {if (array[j] > array[j + 1]) {int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;lastExchange = j;   //特性:最后交互位置后的元素已经有序
                }}}}// 插入排序public static void myInsertSort(int[] array) {for (int i = 1; i <= array.length - 1; ++i) {int temp = array[i];int j = 0; // 给值移位并寻找插入点for (j = i - 1; j >= 0 && array[j] > temp; --j) {array[j + 1] = array[j];}array[j + 1] = temp;}}// 选择排序public static void mySelectSort(int[] array) {for (int i = 0; i < array.length - 1; ++i) {int minIndex = i;// 每次选出一极值for (int j = i + 1; j <= array.length - 1; ++j) {if (array[j] < array[minIndex]) {minIndex = j;}}// 极值归位if (minIndex != i) {int temp = array[minIndex];array[minIndex] = array[i];array[i] = temp;}}}// 希尔排序public static void myShellSort(int[] array) {int gap = 5;while (gap != 0) {//不必刻意分组, 组1->组2->组1->组2...轮流处理for (int j = gap; j <= array.length - 1; ++j) {int temp = array[j];int k = 0;for (k = j - gap; k >= 0 && array[k] > temp; k -= gap) {array[k + gap] = array[k];}array[k + gap] = temp;}gap /= 2;   //重新分组
        }}// 快速排序public static void myQuickSort(int[] array) {myQuickSortCore(array, 0, array.length - 1);}private static void myQuickSortCore(int[] array, int left, int right) {if (left >= right) {   //递归出口return;}int mLeft = left;int mRight = right;int base = array[mLeft];  //第一个元素作为基准, left空位可占while(mLeft != mRight) {while (mRight > mLeft && array[mRight] >= base) {--mRight;}array[mLeft] = array[mRight];  //right可覆盖while (mRight > mLeft && array[mLeft] <= base) {++mLeft;}array[mRight] = array[mLeft];}array[mRight] = base; //基准元素归位, l=r
        myQuickSortCore(array, left, mLeft - 1);  //递归基准以左myQuickSortCore(array, mRight + 1 , right);  //递归基准以右
    }// 归并排序public static void myMergeSort(int[] array) {// 每个分组中有两个来自上层迭代的有序组, gap为有序组长度, 2 * gap为分组长度for (int gap = 1; gap < array.length; gap *= 2) {int i = 0; // array下标// 分组并内部排序while (i + 2 * gap - 1 < array.length) {mergePiece(array, i, i + gap - 1, i + 2 * gap - 1);i += 2 * gap;}// 分组剩余部分排序, 只有超过一个gap才有内部排序的意义if (i + gap - 1 < array.length) {mergePiece(array, i, i + gap - 1, array.length - 1);}}}// 将array中有序的两段piecewise1 和 piecewise2 合并成整体有序public static void mergePiece(int[] array, int head, int mid, int tail) {int i = head; // piecewise1下标 [head, mid]int j = mid + 1; // piecewise2下标 [mid + 1, tail]// 临时数组, 保存结果int[] arrayTemp = new int[tail - head + 1]; // combineint k = 0; // combine下标while (i <= mid && j <= tail) {if (array[i] <= array[j]) {arrayTemp[k] = array[i];++i;++k;} else {arrayTemp[k] = array[j];++j;++k;}}// 复制多余部分 piecewise1while (i <= mid) {arrayTemp[k] = array[i];++i;++k;}// 复制多余部分 piecewise2while (j <= tail) {arrayTemp[k] = array[j];++j;++k;}// 结果复制到原始数组k = 0;i = head; // 重置下标, i piecewise1 + piecewise2while (i <= tail) {array[i] = arrayTemp[k];++i;++k;}}// 堆排序public static void myHeapSort(int[] array) {// 调整堆->大顶堆for (int i = array.length / 2 - 1; i >= 0; --i) { // 从最后非叶子节点开始
            adjustHeap(array, i, array.length);}// 调整堆->交换堆顶/末位元素for (int j = array.length - 1; j > 0; --j) {int temp = array[0];array[0] = array[j];array[j] = temp;adjustHeap(array, 0, j); // 只需调整堆顶父节点
        }}// 调整为大顶堆分布, node为父节点下标, adjustLen为涉及调整的长度(为排序使用)private static void adjustHeap(int[] array, int node, int adjustLen) {int temp = array[node]; // 拿出node形成可占空位for (int i = node * 2 + 1; i < adjustLen; i = node * 2 + 1) {if (i + 1 < adjustLen && array[i] < array[i + 1]) {++i; // 得到最大子节点
            }if (array[i] > temp) {array[node] = array[i];node = i; // 为下一层迭代更新父节点node, 最后为叶子} else {break;}}array[node] = temp;}// 基数排序public static void myRadixSort(int[] array) {int d = maxBit(array);int dec = 1; //进制迭代final int R = 10;  //桶个数int[] tempArray = new int[array.length];  //临时数组, 代替桶存储数组, 代价是需记录下标/数量来分割桶int[] bucketCapacity = new int[R];  //桶计数 for (int i = 1; i <= d; ++i) {for (int j = 0; j < R; ++j) {bucketCapacity[j] = 0;   //清空桶容量
            }//计数1for (int j = 0; j < array.length; ++j) {int k = array[j] / dec % R;  ++bucketCapacity[k];}//计数2 变累计, 为分割for (int j = 1; j < R; ++j) {bucketCapacity[j] = bucketCapacity[j - 1] + bucketCapacity[j];}// 存储进桶for (int j = array.length - 1; j >= 0; --j) {int k = array[j] / dec % R; tempArray[bucketCapacity[k] - 1] = array[j];--bucketCapacity[k];  }// 写出for(int j = 0; j < array.length; ++j) {array[j] = tempArray[j];}// 下一位dec *= 10;}}//求数组元素的最大位数private static int maxBit(int[] array) {int bit = 1;int dec = 10;for (int i = 0; i < array.length; ++i) {while (array[i] >= dec) {++bit;dec *= 10;}}return bit;}
}

posted on 2017-04-09 16:57 myJavaEE 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/myJavaEE/p/6685445.html

八大排序算法的java实现相关推荐

  1. 八大排序算法(java实现) 冒泡排序 快速排序 堆排序 归并排序 等

    八大排序算法 一.直接插入 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度 二.希尔排序 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度 三.简单选择 - 1. ...

  2. 八大排序算法总结——Java篇

    概述: 作为算法的鼻祖,八大排序是我们一定要了解学习的,废话不多说,直奔主题. 一. 直接插入排序 二.希尔排序 三.冒泡排序 四.快速排序 五.简单选择排序 六.堆排序 七.基数排序 八.归并排序 ...

  3. 八大排序算法总结Java代码实现(建议收藏后食用)

    目录 排序算法介绍 相关术语 排序的稳定性 排序分类 内排序与外排序 算法时间复杂度 度量一个程序(算法)执行时间的两种方法 时间频度 忽略常数项 忽略低次项 忽略系数 时间复杂度 常数阶O(1) 对 ...

  4. 图解八大排序算法——我见过的最详细的讲解(转)

    一.分类 1.内部排序和外部排序 内部排序:待排序记录存放在计算机随机存储器中(说简单点,就是内存)进行的排序过程. 外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需 ...

  5. C语言八大排序算法,附动图和详细代码解释!

    文章来源:电子工程专辑.C语言与程序设计.竹雨听闲 一.前言 如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功. 想写出精炼.优秀的代码,不通过不断的锤炼,是很难做到的. 二. ...

  6. 硬核!C语言八大排序算法,附动图和详细代码解释!

    来源 :C语言与程序设计.竹雨听闲等 一 前言 如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功. 想写出精炼.优秀的代码,不通过不断的锤炼,是很难做到的. 二 八大排序算法 ...

  7. 【数据结构排序算法系列】数据结构八大排序算法

    排序算法在计算机应用中随处可见,如Windows操作系统的文件管理中会自动对用户创建的文件按照一定的规则排序(这个规则用户可以自定义,默认按照文件名排序)因此熟练掌握各种排序算法是非常重要的,本博客将 ...

  8. 数据结构进阶 八大排序算法详解

    数据结构就是定义出某种结构:像数组结构.链表结构.树形结构等,实现数据结构就是我们主动去管理增删查改的实现函数 排序的概念 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列 ...

  9. 冒泡和快速排序的时间复杂度_java 八大排序算法 冒泡排序 快速排序 堆排序 归并排序 等...

    八大排序算法 一.直接插入 1.基本思路 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环 ...

最新文章

  1. BCH优势或从暗网彰显
  2. 让delphi程序不受WINDOWS日期格式的影响
  3. 杭州阿里、海康、网易等组成 的HR 联盟对打工人的影响
  4. 云吟职中计算机老师,夹江县云吟职业中学校018招生简介
  5. Charles抓包工具_基本功能
  6. 单台服务器最大支持多少连接数
  7. 集群ddos_《DNS攻击防范科普系列2》 -DNS服务器怎么防DDoS攻击
  8. Stata15 Unicode:一次性转码,解决中文乱码问题
  9. 微信小程序 访问locolhost_微信小程序 数据访问实例详解
  10. iec104点号_IEC104规约流程
  11. mysql 参数嗅探_一次存储过程参数嗅探定位流程总结
  12. 玩转 Windows 10 中的 Linux 子系统
  13. Python打印二叉树的左视图、右视图
  14. 【设计模式03】 建造者模式
  15. DVWA windows提权
  16. 翻译:Deep Multimodal Clustering for Unsupervised Audiovisual Learning
  17. 递归算法到非递归算法的转换
  18. 班得瑞 Bandari 《班得瑞13张专辑全收藏》【APE+CUE/百度网盘地址】
  19. JavaScript error: resource://gre/modules/XULStore.jsm, line 66: Error: Can‘t find profile directory
  20. 中国劳动关系学院计算机专业分数,中国劳动关系学院是几本?录取分数线是多少?...

热门文章

  1. Node.js 多版本安装方式
  2. c语言剪刀石头布课程设计,C++剪刀石头布游戏课程设计方案.doc
  3. google nexus5 root 安装Xposed框架教程
  4. Dapper的基本使用 [转]
  5. 20180104小测
  6. slf4j + logback 输出日志:mybatis sql语句
  7. 扩展用户体验之操作栏ActionBar
  8. JVM与Dalvik
  9. 最短路径dijkstra
  10. 利用tcpdump抓取mysql sql语句