最近查资料发现java排序挺有意思的,其中包含常见八种具有代表性的排序法;笔者觉得排序的功能重要,但更重要的是排序的思想;所以简单叙述一下常见排序方法名称,并用代码举例。

A.插入排序(直接插入排序、希尔排序);
B.交换排序(冒泡排序、快速排序);
C.选择排序(直接选择排序、堆排序);
D.归并排序;
E.分配排序(基数排序);

所需辅助空间最多:归并排序;
所需辅助空间最少:堆排序;
平均速度最快:快速排序;

不稳定:快速排序,希尔排序,堆排序。

代码块:

  1. package com.sinolife.mtrs.apply.controller;
  2.  
  3. import java.util.Arrays;
  4.  
  5. /**
  6. * @author delin Li
  7. * @version createTime:2017-12-7下午04:10:37
  8. * @Description
  9. */
  10. public class TestSort {
  11.  
  12. /**
  13. * @param args
  14. */
  15. public static void main(String[] args) {
  16. int[] ins = {1,3,53,7,81,2,5,71,9};
  17. // insertSort(ins);//直接插入排序
  18. // shellSort(ins);//希尔排序,
  19. // sampleSelectSort(ins);//简单选择排序
  20. // heapSort(ins);//堆排序
  21. // bubbleSort(ins);//冒泡 排序
  22. // quikSort(ins,0,ins.length-1);//快速排序
  23. // mergeSort(ins,0,ins.length-1);//归并排序
  24. radixSort(ins,10,2);//基排序
  25. print(ins);
  26. }
  27.  
  28. public static void print(int[] data) {
  29. for (int i = 0; i < data.length; i++) {
  30. System.out.print(data[i] + " ");
  31. }
  32. }
  33.  
  34. //直接插入排序
  35. /*public static void insertSort(int arg[]){
  36. for(int i=1;i<arg.length;i++){//将第一个数当做已经排好序的值,然后将后边无序数依次插入到已经排好的列表中
  37. int j;
  38. int temp = arg[i];//插入的数值
  39. for(j=i;temp<arg[j-1]&&j>0;j--){
  40. arg[j] = arg[j-1];////通过循环,逐个后移一位找到要插入的位置。
  41. }
  42. arg[j]=temp;//插入
  43. }
  44. }*/
  45.  
  46. //希尔
  47. /*public static void shellSort(int a[]){
  48. int n = a.length;
  49. for(int i = n/2;i>0; i /=2){
  50. for(int j = i;j<n;j++){//每个元素与自己组内的数据进行直接插入排序
  51. if(a[j]<a[j-i]){
  52. int temp = a[j];
  53. int k = j-i;
  54. while(k>=0&&a[k]>temp){
  55. a[k+i] = a[k];
  56. k -=i;
  57. }
  58. a[k+i] = temp;
  59. }
  60. }
  61. }
  62. }*/
  63.  
  64. //简单选择排序
  65. /*public static void sampleSelectSort(int[] a){
  66. int minV;//临时保存最小值
  67. int minI;//临时保存最小值下标
  68. for(int i= 0;i<a.length-1;i++){
  69. minV = a[i];
  70. minI = i;
  71. for(int j = i+1;j<a.length;j++){
  72. if(a[j]<minV){
  73. minV = a[j];
  74. minI = j;
  75. }
  76. }
  77. if(minV != a[i] && minI !=i){
  78. a[minI] = a[i];
  79. a[i] = minV;
  80. }
  81. }
  82. }*/
  83.  
  84. //堆排序
  85. /*public static void swap(int[] data, int i, int j) {
  86. if (i == j) {
  87. return;
  88. }
  89. data[i] = data[i] + data[j];
  90. data[j] = data[i] - data[j];
  91. data[i] = data[i] - data[j];
  92. }
  93.  
  94. public static void heapSort(int[] data) {
  95. for (int i = 0; i < data.length; i++) {
  96. createMaxdHeap(data, data.length - 1 - i);
  97. swap(data, 0, data.length - 1 - i);
  98. print(data);
  99. }
  100. }
  101.  
  102. public static void createMaxdHeap(int[] data, int lastIndex) {
  103. for (int i = (lastIndex - 1) / 2; i >= 0; i--) {
  104. // 保存当前正在判断的节点
  105. int k = i;
  106. // 若当前节点的子节点存在
  107. while (2 * k + 1 <= lastIndex) {
  108. // biggerIndex总是记录较大节点的值,先赋值为当前判断节点的左子节点
  109. int biggerIndex = 2 * k + 1;
  110. if (biggerIndex < lastIndex) {
  111. // 若右子节点存在,否则此时biggerIndex应该等于 lastIndex
  112. if (data[biggerIndex] < data[biggerIndex + 1]) {
  113. // 若右子节点值比左子节点值大,则biggerIndex记录的是右子节点的值
  114. biggerIndex++;
  115. }
  116. }
  117. if (data[k] < data[biggerIndex]) {
  118. // 若当前节点值比子节点最大值小,则交换2者得值,交换后将biggerIndex值赋值给k
  119. swap(data, k, biggerIndex);
  120. k = biggerIndex;
  121. } else {
  122. break;
  123. }
  124. }
  125. }
  126. }*/
  127.  
  128. //冒泡排序
  129. /*public static void bubbleSort(int[] a){
  130. for (int i = 0; i < a.length-1; i++) {
  131. for (int j = i; j < a.length-i-1; j++) {
  132. if(a[j]>a[j+1]){
  133. int temp = a[j];
  134. a[j] = a[j+1];
  135. a[j+1] = temp;
  136. }
  137. }
  138. }
  139. }*/
  140.  
  141. //快速排序
  142. /*public static void quikSort(int data[], int start, int end) {
  143.  
  144. if (end - start <= 0) {
  145. return;
  146. }
  147. int last = start;
  148. for (int i = start + 1; i <= end; i++) {
  149. if (data[i] < data[start]) {
  150. int temp = data[++last];
  151. data[last] = data[i];
  152. data[i] = temp;
  153. }
  154. }
  155. int temp = data[last];
  156. data[last] = data[start];
  157. data[start] = temp;
  158. quikSort(data, start, last - 1);
  159. quikSort(data, last + 1, end);
  160. }*/
  161.  
  162. //归并排序
  163. /*public static void mergeSort(int data[], int start, int end) {
  164. if (start < end) {
  165. int mid = (start + end) / 2;
  166. mergeSort(data, start, mid);
  167. mergeSort(data, mid + 1, end);
  168. merge(data, start, mid, end);
  169. }
  170. }
  171.  
  172. public static void merge(int data[], int start, int mid, int end) {
  173. int temp[] = new int[end - start + 1];
  174. int i = start;
  175. int j = mid + 1;
  176. int k = 0;
  177. while (i <= mid && j <= end) {
  178. if (data[i] < data[j]) {
  179. temp[k++] = data[i++];
  180. } else {
  181. temp[k++] = data[j++];
  182. }
  183. }
  184.  
  185. while (i <= mid) {
  186. temp[k++] = data[i++];
  187. }
  188. while (j <= end) {
  189. temp[k++] = data[j++];
  190. }
  191.  
  192. for (k = 0, i = start; k < temp.length; k++, i++) {
  193. data[i] = temp[k];
  194. }
  195. }*/
  196.  
  197. //基排序
  198. public static void radixSort(int[] data, int radix, int d) {
  199. // 缓存数组
  200. int[] tmp = new int[data.length];
  201. // buckets用于记录待排序元素的信息
  202. // buckets数组定义了max-min个桶
  203. int[] buckets = new int[radix];
  204.  
  205. for (int i = 0, rate = 1; i < d; i++) {
  206.  
  207. // 重置count数组,开始统计下一个关键字
  208. Arrays.fill(buckets, 0);
  209. // 将data中的元素完全复制到tmp数组中
  210. System.arraycopy(data, 0, tmp, 0, data.length);
  211.  
  212. // 计算每个待排序数据的子关键字
  213. for (int j = 0; j < data.length; j++) {
  214. int subKey = (tmp[j] / rate) % radix;
  215. buckets[subKey]++;
  216. }
  217. for (int j = 1; j < radix; j++) {
  218. buckets[j] = buckets[j] + buckets[j - 1];
  219. }
  220. // 按子关键字对指定的数据进行排序
  221. for (int m = data.length - 1; m >= 0; m--) {
  222. int subKey = (tmp[m] / rate) % radix;
  223. data[--buckets[subKey]] = tmp[m];
  224. }
  225. rate *= radix;
  226. }
  227. }
  228. }

如有错误,请朋友们提出!

java常用八大排序法的更多相关文章

  1. Java使用选择排序法对数组排序

    编写程序,实现将输入的字符串转换为一维数组,并使用选择排序法对数组进行排序. 思路如下: 点击"生成随机数"按钮,创建Random随机数对象: 使用JTextArea的setTex ...

  2. java之八大排序

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

  3. java:选择排序法对数组排序

    最近想练一练Java的算法,然后碰到LeetCode上一道从排序数组删除重复项的小题,刚开始没看到是从排序数组中,就乱写,其实要是排序树组,就比乱序的感觉上好写多了.然后就想回顾下冒泡法对数组排序,凭 ...

  4. Java数组 —— 八大排序

    (请观看本人博文--<详解 普通数组 -- Arrays类 与 浅克隆>) 在本人<数据结构与算法>专栏的讲解中,本人讲解了如何去实现数组的八大排序. 但是,在讲解的过程中,我 ...

  5. java 的八大排序

    import java.util.Arrays;import java.util.*; public class Sort { /** * 插入排序 */ public static void ins ...

  6. java实现八大排序算法

    Arrays.sort() 采用了2种排序算法 -- 基本类型数据使用快速排序法,对象数组使用归并排序. java的Collections.sort算法调用的是归并排序,它是稳定排序 方法一:直接插入 ...

  7. java的八大排序

    public class Sort2 { public static void main(String[] args) { Sort2 sort = new Sort2(); System.out.p ...

  8. Java常用的排序算法三

    Merge Sort :归并排序:用递归的思想,分解成单个元素的排序,在归并 代码: import java.util.*; public class MergeSort { public stati ...

  9. Java实现八大排序之冒泡排序

    冒泡排序 冒泡排序的定义: 冒泡排序(Bubble Sort)它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该 ...

随机推荐

  1. iphone的一些坑

    1.<div contenteditable></div>需要添加css user-select: text;才能输入. 2.css属性animation一直存在,添加了-we ...

  2. Flume-NG启动过程源码分析(二)(原创)

    在上一节中讲解了——Flume-NG启动过程源码分析(一)(原创)  本节分析配置文件的解析,即PollingPropertiesFileConfigurationProvider.FileWatch ...

  3. hdu 4737 A Bit Fun 尺取法

    A Bit Fun Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Proble ...

  4. monkey参数应用

    1.指定seed值 adb shell monkey -v -p package -s 100  100 2.touch事件(参数后都跟百分比) 3.设定动作百分比 4.轨迹球 5.基本导航事件 输入 ...

  5. Ubuntu linux背景指南:在开始之前需要知道哪些东西

    1.摘要 Ubuntu是一个新的GNU/Linux衍生操作系统,其目标是更多地以用户为本以及桌面应用. 因此,Ubuntu的目的是消除安装的困难,在很大程度上靠自动配置和自动探测硬件解决 问题,无须用 ...

  6. 解决Chrome Safari Opera环境下 动态创建iframe onload事件同步执行

    我们先看下面的代码: setTimeout(function(){ alert(count); },2000); var count = []; document.body.appendChild(c ...

  7. java.lang.Exception: No runnable methods at org.junit.runners.BlockJUnit4ClassRunner.validateInstanceMethods(BlockJUnit4ClassRunner.java:191)

    使用方法测试时出现以下错误 java.lang.Exception: No runnable methods at org.junit.runners.BlockJUnit4ClassRunner.v ...

  8. mysql 练习题答案

    一 题目 1.查询所有的课程的名称以及对应的任课老师姓名 2.查询学生表中男女生各有多少人 3.查询物理成绩等于100的学生的姓名 4.查询平均成绩大于八十分的同学的姓名和平均成绩 5.查询所有学生的 ...

  9. nyoj-1132-promise me a medal(求线段交点)

    题目链接 /* Name:nyoj-1132-promise me a medal Copyright: Author: Date: 2018/4/26 20:26:22 Description: 向 ...

  10. 在ios7中使用zxing

    ZXing(Github镜像地址)是一个开源的条码生成和扫描库(开源协议为Apache2.0).它不但支持众多的条码格式,而且有各种语言的实现版本,它支持的语言包括:Java, C++, C#, Ob ...