1. package edu.cn.ysw;
  2.  
  3. //八种排序算法的实现与效率分析
  4. /*
  5. * 内排序的种类:
  6. * 1.插入排序:直接插入排序、希尔排序。
  7. * 2.选择排序:简单选择排序、堆排序。
  8. 3.交换排序:冒泡排序、快速排序。
  9. 4.归并排序
  10. 5.基数排序
  11. */
  12. public class SortedMethods {
  13.  
  14. /**
  15. * @author ysw
  16. * @param args
  17. * @throws Exception
  18. * @since 6/15/2017
  19. */
  20. // 直接插入排序:1.有哨兵;2.无哨兵
  21. // 无哨兵
  22. public void insertSortWithoutPre(int arr[]) {
  23. if (arr == null || arr.length == 0) {
  24. return;
  25. }
  26. // 外层循环定义排序次数
  27. for (int i = 1; i < arr.length; i++) {
  28. // 不满足条件则忽略此次判断,相当于continue;
  29. if (arr[i] < arr[i - 1]) {
  30. int tempValue = arr[i];
  31. int j;
  32. for (j = i - 1; j >= 0 && tempValue < arr[j]; j--) {
  33. arr[j + 1] = arr[j];
  34. }
  35. arr[j + 1] = tempValue;
  36. }
  37. }
  38. }
  39.  
  40. // 有哨兵的直接插入排序
  41. public void insertSortWithPre(int arr[]) {
  42. for (int i = 2; i < arr.length; i++) {
  43. /*
  44. * 哨兵的作用: 1:保存等待插入的数字; 2:防止数组越界的情况;
  45. */
  46. if (arr[i] < arr[i - 1]) {
  47. arr[0] = arr[i];
  48. int j;
  49. for (j = i - 1; arr[0] < arr[j]; j--) {
  50. arr[j + 1] = arr[j];
  51. }
  52. arr[j + 1] = arr[0];
  53. }
  54. }
  55. }
  56.  
  57. // 希尔排序
  58. public void shellSort(int arr[]) {
  59. if (arr == null || arr.length == 0) {
  60. return;
  61. }
  62. // 增量序列
  63. int incrementValue = arr.length / 2;
  64. while (incrementValue >= 1) {
  65. for (int i = 0; i < arr.length; i++) {
  66. for (int j = i + incrementValue; j < arr.length; j += incrementValue) {
  67. int temp = arr[j];
  68. int k;
  69. for (k = j - incrementValue; k >= 0 && arr[k] > temp; k = k
  70. - incrementValue) {
  71. arr[k + incrementValue] = arr[k];
  72. }
  73. arr[k + incrementValue] = temp;
  74. }
  75. }
  76. // 改变递增序列的值
  77. incrementValue /= 2;
  78. }
  79. }
  80.  
  81. /*
  82. * 选择排序: 1.简单选择排序 2.堆排序
  83. */
  84.  
  85. // 简单选择排序
  86. public void selectSort(int arr[]) {
  87. for (int i = 0; i < arr.length - 1; i++) {
  88. for (int j = i + 1; j < arr.length; j++) {
  89. if (arr[i] > arr[j]) {
  90. swap(arr, i, j);
  91. }
  92. }
  93. }
  94. }
  95.  
  96. // 堆排序:实践中多用于调度算法,比如线程优先级调度
  97. // 时间驱动:取最小值或者等待时间最长
  98.  
  99. // 冒泡排序
  100. public void bubbleSort(int arr[]) {
  101. for (int i = 0; i < arr.length - 1; i++) {
  102. for (int j = 0; j < arr.length - 1 - i; j++) {
  103. if (arr[j] > arr[j + 1]) {
  104. swap(arr, j, j + 1);
  105. }
  106. }
  107. }
  108. }
  109.  
  110. // 快速排序:挖坑填数+分治
  111.  
  112. // 快速排序返回基准值最终位置的函数partition:回调整后基准数的位置
  113. public int partition(int arr[], int l, int r) {
  114. // 假设第一个基准值为arr[0];
  115. int left = l;
  116. int right = r;
  117. int key = arr[left];
  118. while (left < right) {
  119. while (left < right && arr[right] >= key) {
  120. right--;
  121. }
  122. if (left < right) {
  123. arr[left] = arr[right];
  124. left++;
  125. }
  126. while (left < right && arr[left] <= key) {
  127. left++;
  128. }
  129. if (left < right) {
  130. arr[right] = arr[left];
  131. right--;
  132. }
  133. }
  134. arr[left] = key;
  135.  
  136. return left;
  137. }
  138.  
  139. // 快速排序
  140. public void quickSort(int arr[], int l, int r) {
  141. if (l < r) {
  142. int index = partition(arr, l, r);
  143. quickSort(arr, l, index - 1);
  144. quickSort(arr, index + 1, r);
  145. }
  146. }
  147.  
  148. // 归并排序
  149.  
  150. public void mergeSort(int arr[]) {
  151. sort(arr, 0, arr.length - 1);
  152. }
  153.  
  154. public void sort(int[] arr, int left, int right) {
  155. if (left >= right) {
  156. return;
  157. }
  158. int center = (left + right) / 2;
  159. sort(arr, left, center);
  160. sort(arr, center + 1, right);
  161. merge(arr, left, center, right);
  162. }
  163.  
  164. public void merge(int[] arr, int left, int center, int right) {
  165. // 定义一个辅助数组来存放归并的两个子数组
  166. int tempArray[] = new int[arr.length];
  167. // 左面子数组的第一个元素
  168. int leftFirst = left;
  169. // 右面子数组的第一个元素
  170. int rightFirst = center + 1;
  171. // 指向辅助数组的第一个元素
  172. int tempPointer = left;
  173. while (leftFirst <= center && rightFirst <= right) {
  174. if (arr[leftFirst] <= arr[rightFirst]) {
  175. tempArray[tempPointer++] = arr[leftFirst++];
  176. } else {
  177. tempArray[tempPointer++] = arr[rightFirst++];
  178.  
  179. }
  180. }
  181.  
  182. // 将第一个数组中剩下的元素添加到辅助数组中
  183. while (leftFirst <= center) {
  184. tempArray[tempPointer++] = arr[leftFirst++];
  185. }
  186. // 将第二个数组中剩下的元素添加到辅助数组中
  187. while (rightFirst <= right) {
  188. tempArray[tempPointer++] = arr[rightFirst++];
  189. }
  190. }
  191.  
  192. // 打印数组的函数
  193. public void printArr(int arr[]) {
  194. for (int i = 0; i < arr.length; i++) {
  195. System.out.print(arr[i]);
  196. if (i != arr.length - 1) {
  197. System.out.print(",");
  198. }
  199. }
  200. System.out.println();
  201. }
  202.  
  203. // 交换数组的元素
  204. public void swap(int arr[], int i, int j) {
  205. int temp = arr[i];
  206. arr[i] = arr[j];
  207. arr[j] = temp;
  208. }
  209.  
  210. public static void main(String[] args) {
  211. SortedMethods sMethods = new SortedMethods();
  212. // 测试需要的数组
  213. int array1[] = { 1, 2, 3, 4, 5 };
  214. int array2[] = { 5, 4, 3, 2, 1 };
  215. int array3[] = { 4, 5, 2, 1, 7 };
  216. int array4[] = null;
  217. int array5[] = new int[0];
  218. // 测试无哨兵的插入排序
  219.  
  220. System.out.println("--------有哨兵插入排序--------------");
  221.  
  222. sMethods.insertSortWithoutPre(array1);
  223. sMethods.printArr(array1);
  224. sMethods.insertSortWithoutPre(array2);
  225. sMethods.printArr(array2);
  226. sMethods.insertSortWithoutPre(array3);
  227. sMethods.printArr(array3);
  228. /*
  229. * sMethods.insertSortWithoutPre(array4); sMethods.printArr(array4);
  230. * sMethods.insertSortWithoutPre(array5); sMethods.printArr(array5);
  231. */
  232. System.out.println("--------无哨兵插入排序------------");
  233. // 测试有哨兵的插入排序
  234. sMethods.insertSortWithoutPre(array1);
  235. sMethods.printArr(array1);
  236. sMethods.insertSortWithoutPre(array2);
  237. sMethods.printArr(array2);
  238. sMethods.insertSortWithoutPre(array3);
  239. sMethods.printArr(array3);
  240. System.out.println("----------希尔排序------------");
  241. // 测试希尔排序
  242. sMethods.shellSort(array1);
  243. sMethods.printArr(array1);
  244. sMethods.shellSort(array2);
  245. sMethods.printArr(array2);
  246. sMethods.shellSort(array3);
  247. sMethods.printArr(array3);
  248. System.out.println("---------简单选择排序------------");
  249. sMethods.selectSort(array1);
  250. sMethods.printArr(array1);
  251. sMethods.selectSort(array2);
  252. sMethods.printArr(array2);
  253. sMethods.selectSort(array3);
  254. sMethods.printArr(array3);
  255. System.out.println("---------冒泡排序------------");
  256. sMethods.bubbleSort(array1);
  257. sMethods.printArr(array1);
  258. sMethods.bubbleSort(array2);
  259. sMethods.printArr(array2);
  260. sMethods.bubbleSort(array3);
  261. sMethods.printArr(array3);
  262. System.out.println("---------快速排序------------");
  263. sMethods.quickSort(array3, 0, array3.length - 1);
  264. sMethods.printArr(array3);
  265. System.out.println("---------归并排序排序------------");
  266. sMethods.mergeSort(array3);
  267. sMethods.printArr(array3);
  268.  
  269. }
  270.  
  271. }

  

六种常见排序算法的java实现的更多相关文章

  1. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  2. 常见排序算法总结 -- java实现

    常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间 ...

  3. 常见排序算法(java实现)

    常见排序算法介绍 冒泡排序 代码: public class BubbleSort { public static void sort(int[] array) { int tValue; for ( ...

  4. 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)

    排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列. 稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关 ...

  5. 几种常见排序算法的java实现

    一.几种常见的排序算法性能比較 排序算法 最好时间 平均时间 最坏时间 辅助内存 稳定性 备注 简单选择排序 O(n^2) O(n^2) O(n^2) O(1) 不稳定 n小时较好 直接插入排序 O( ...

  6. 常见排序算法及Java实现

    先上个总图↓: ①.直接插入排序 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并 ...

  7. 常见排序算法及其java实现

    最近学习了下java,感觉java在基本语法上与C++非常相似.作为练习,我用java实现了冒泡排序.选择排序.插入排序.基尔排序.快速排序.堆排序.计数排序.合并排序. 以下为实现代码: publi ...

  8. 常见排序算法题(java版)

    常见排序算法题(java版) //插入排序:   package org.rut.util.algorithm.support;   import org.rut.util.algorithm.Sor ...

  9. Java基础语法(8)-数组中的常见排序算法

    title: Java基础语法(8)-数组中的常见排序算法 blog: CSDN data: Java学习路线及视频 1.基本概念 排序: 是计算机程序设计中的一项重要操作,其功能是指一个数据元素集合 ...

随机推荐

  1. pygame 笔记-2 模仿超级玛丽的弹跳

    在上一节的基础上,结合高中物理中的匀加速直线运动位移公式 ,就能做出类似超级玛丽的弹跳效果. import pygame pygame.init() win = pygame.display.set_ ...

  2. zookeeper 实现分布式锁安全用法

    zookeeper 实现分布式锁安全用法 标签: zookeeper sessionExpire connectionLoss 分布式锁 背景 ConnectionLoss 链接丢失 SessionE ...

  3. gitlab配置通过smtp发送邮件(QQ exmail腾讯企业为例)

    gitlab配置通过smtp发送邮件(QQ exmail腾讯企业为例) 首先祭出官网文档链接:https://docs.gitlab.com/omnibus/settings/smtp.html 其实 ...

  4. Convert ResultSet to JSON and XML

    public static JSONArray convertToJSON(ResultSet resultSet) throws Exception { JSONArray jsonArray = ...

  5. webstorm+nodejs+express配置

  6. Pilosa文档翻译(一)导言、安装

    目录 导言 安装 安装在MacOS 使用HomeBrew 下载二进制文件 从源码构建 使用Docker 安装在Linux 下载二进制文件 从源码构建 使用Docker 接下来是什么? 导言 原文地址 ...

  7. http范围请求

    基于范围请求 可以实现 断点续传和多线程分片下载 HTTP/1.1之后才支持,需要双端都支持 服务端头信息中有 Accept-Ranges:bytes 表明服务器支持范围请求 curl -I &quo ...

  8. window炫丽cmd的别名cmder

    windows下的cmd,色彩度用起来不爽,cmder是对cmd的补充,界面很清爽 01.下载 https://github.com/cmderdev/cmder http://cmder.net/ ...

  9. Docker入门实践

    Docker是一门很成熟的容器技术,类似虚拟机技术主要用做环境的隔离,方便环境的复制镜像,虚拟机是基于操作系统这一层的,而Docker更加的轻量级,像是“应用”层级的.比如我需要一个MySQL环境.一 ...

  10. MySQL技术内幕读书笔记(一)——Mysql体系结构和存储引擎

    目录 MySQL体系结构和存储引擎 定义数据库和实例 MYSQL体系结构 MYSQL存储引擎 MySQL体系结构和存储引擎 定义数据库和实例 数据库:物理操作系统文件或者其他形式文件类型的结合.在MY ...