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

以下为实现代码:

  1. public class Sort{
  2. public void print_arr(int[] arr){
  3. int len = arr.length;
  4. for (int i = 0; i < len; i++){
  5. System.out.print("" + arr[i] + " ");
  6. }
  7. System.out.println("");
  8. }
  9.  
  10. public int[] dup_arr(int[] arr){
  11. int len = arr.length;
  12. int re[] = new int[len];
  13. for (int i = 0; i < len; i++){
  14. re[i] = arr[i];
  15. }
  16. return re;
  17. }
  18.  
  19. public int[] bubble(int[] arr){
  20. int dup[] = this.dup_arr(arr);
  21. int len = dup.length;
  22. int tmp = 0;
  23. for (int i = 0; i < len; i++){
  24. for (int j = 0; j < len - 1 - i; j++){
  25. if (dup[j] < dup[j+1]){
  26. tmp = dup[j];
  27. dup[j] = dup[j+1];
  28. dup[j+1] = tmp;
  29. }
  30. }
  31. }
  32. return dup;
  33. }
  34.  
  35. public int[] selection(int[] arr){
  36. int dup[] = this.dup_arr(arr);
  37. int len = dup.length;
  38. int tmp = 0;
  39. int max = 0;
  40. for (int i = 0; i < len; i++){
  41. max = i;
  42. for (int j = i + 1; j < len; j++){
  43. if (dup[j] > dup[max]){
  44. max = j;
  45. }
  46. }
  47. tmp = dup[i];
  48. dup[i] = dup[max];
  49. dup[max] = tmp;
  50. }
  51.  
  52. return dup;
  53. }
  54.  
  55. public int[] insertion(int[] arr){
  56. int dup[] = this.dup_arr(arr);
  57. for (int i = 1; i < dup.length; i++){
  58. int key = dup[i];
  59. int j = i - 1;
  60. while (j >= 0 && dup[j] < key){
  61. dup[j + 1] = dup[j];
  62. j--;
  63. }
  64. dup[j + 1] = key;
  65. }
  66. return dup;
  67. }
  68.  
  69. public int[] shell(int[] arr, int step){
  70. int dup[] = this.dup_arr(arr);
  71. while (step > 0){
  72. //insertion sorting
  73. for (int i = step; i < dup.length; i += step){
  74. int j = i - step;
  75. int key = dup[i];
  76. while (j >= 0 && dup[j] < key){
  77. dup[j + step] = dup[j];
  78. j -= step;
  79. }
  80. dup[j + step] = key;
  81. }
  82. step = step / 2;
  83. }
  84. return dup;
  85. }
  86.  
  87. public void quick(int[] dup, int leftpoint, int rightpoint){
  88. if (leftpoint >= rightpoint){
  89. return;
  90. }
  91. int key = dup[rightpoint];
  92. int left = leftpoint;
  93. int right = rightpoint;
  94. while (true){
  95. while (left < right && dup[left] >= key){
  96. left++;
  97. }
  98. while (left < right && dup[right] <= key){
  99. right--;
  100. }
  101. int tmp = 0;
  102. if (left >= right){
  103. tmp = dup[right];
  104. dup[right] = key;
  105. dup[rightpoint] = tmp;
  106. break;
  107. }
  108. tmp = dup[right];
  109. dup[right] = dup[left];
  110. dup[left] = tmp;
  111. }
  112. this.quick(dup, leftpoint, left - 1);
  113. this.quick(dup, left + 1, rightpoint);
  114. }
  115.  
  116. //min heap
  117. public int micro_adjust(int[] arr, int i, int last){
  118. if (2 * i + 1 > last){
  119. return i;
  120. }
  121.  
  122. int max = arr[i] < arr[2 * i + 1] ? i : (2 * i + 1);
  123. if (2 * i + 2 > last){
  124. return max;
  125. }
  126.  
  127. max = arr[max] < arr[2 * i + 2] ? max : (2 * i + 2);
  128. if (max != i){
  129. int tmp = arr[i];
  130. arr[i] = arr[max];
  131. arr[max] = tmp;
  132. }
  133.  
  134. return max;
  135. }
  136. //part of heap sorting. build a min heap
  137. public void build_heap(int[] arr, int last){
  138. int mid = (last + 1) / 2 - 1;
  139. for (int i = mid; i >= 0; i--){
  140. int tmp = micro_adjust(arr, i, last);
  141. //System.out.print("i: " + i + " tmp: " + tmp + "arr: ");
  142. //this.print_arr(arr);
  143. int flag = i;
  144. while (tmp <= mid && tmp != flag){
  145. flag = tmp;
  146. tmp = micro_adjust(arr, tmp, last);
  147. }
  148. }
  149. return;
  150. }
  151. //part of heap sorting. adjust the left arr
  152. public void adjust_heap(int[] arr, int last){
  153. int tmp = arr[0];
  154. arr[0] = arr[last];
  155. arr[last] = tmp;
  156. this.build_heap(arr, last - 1);
  157. return;
  158. }
  159. //use min heap to sort arr from big to small
  160. public int[] heap(int[] arr){
  161. int dup[] = this.dup_arr(arr);
  162. this.build_heap(dup, dup.length - 1);
  163. for (int i = 0; i < dup.length; i++){
  164. //System.out.print("i: " + i + " arr: ");
  165. //this.print_arr(dup);
  166. adjust_heap(dup, dup.length - 1 - i);
  167. }
  168. return dup;
  169. }
  170.  
  171. public int[] counting(int[] arr){
  172. int min = arr[0];
  173. int max = arr[0];
  174. for (int i = 1; i < arr.length; i++){
  175. min = min < arr[i] ? min : arr[i];
  176. max = max > arr[i] ? max : arr[i];
  177. }
  178.  
  179. int buckets[] = new int[max - min + 1];
  180. int index = 0;
  181. for (int i = 0; i < arr.length; i++){
  182. index = arr[i] - min;
  183. buckets[index]++;
  184. }
  185.  
  186. int res[] = new int[arr.length];
  187. for (int i = 0; i < res.length; i++){
  188. res[i] = -1;
  189. }
  190.  
  191. for (int i = 0; i < arr.length; i++){
  192. index = arr[i] - min;
  193. int cnt = 0;
  194. for (int j = 0; j < index; j++){
  195. cnt += buckets[j];
  196. }
  197. while (res[res.length - 1 - cnt] != -1){
  198. cnt++;
  199. }
  200. res[res.length - 1 - cnt] = arr[i];
  201. }
  202. return res;
  203. }
  204.  
  205. /*Failure: don't know how to build the buckets arr ......
  206. public int[] radix(int[] arr){
  207. int dup[] = this.dup_arr(arr);
  208.  
  209. Queue[] buckets = new Queue[10];
  210. for (int i = 0; i < 10; i++){
  211. buckets[i] = new LinkedList();
  212. }
  213.  
  214. int max = dup[0];
  215. for (int i = 1; i < dup.length; i++){
  216. max = max > dup[i] ? max : dup[i];
  217. }
  218.  
  219. int n = 10;
  220. while (max > 0){
  221. for (int i = 0; i < dup.length; i++){
  222. buckets[dup[i] % n].add(dup[i]);
  223. }
  224. int j = 0;
  225. for (int i = 0; i < 10; i++){
  226. while (!buckets[i].isEmpty()){
  227. dup[j++] = buckets[i].getFirst();
  228. buckets[i].removeFirst();
  229. }
  230. }
  231. max /= 10;
  232. n *= 10;
  233. }
  234. return dup;
  235. }
  236. */
  237.  
  238. //part of merge sorting: merge two arr together
  239. public int[] merge(int[] arr1, int[] arr2){
  240. int res[] = new int[arr1.length + arr2.length];
  241. int i = 0;
  242. int j = 0;
  243. int k = 0;
  244. while (i < arr1.length && j < arr2.length){
  245. if (arr1[i] > arr2[j]){
  246. res[k++] = arr1[i++];
  247. }else{
  248. res[k++] = arr2[j++];
  249. }
  250. }
  251.  
  252. while (i < arr1.length){
  253. res[k++] = arr1[i++];
  254. }
  255. while (j < arr2.length){
  256. res[k++] = arr2[j++];
  257. }
  258. return res;
  259. }
  260. //the main part of merge_sort
  261. public int[] merge_sort(int[] arr, int start, int end){
  262. //System.out.println("start: " + start + " end: " + end);
  263. if (end - start < 1){
  264. //System.out.println("end == start");
  265. int tmp[] = {arr[start]};
  266. return tmp;
  267. }
  268.  
  269. int flag = (end - start) / 2;
  270. int res1[] = merge_sort(arr, start, start + flag);
  271. //System.out.println("res1:");
  272. //this.print_arr(res1);
  273. int res2[] = merge_sort(arr, start + flag + 1, end);
  274. //System.out.println("res2:");
  275. //this.print_arr(res2);
  276. int res[] = merge(res1, res2);
  277. //this.print_arr(res);
  278. return res;
  279. }
  280.  
  281. public static void main(String[] args){
  282. int arr[] = {6, 6, 7, 5, 3, 2, 4, 1, 8, 9, 0};
  283. Sort s = new Sort();
  284. System.out.print("The original array: ");
  285. s.print_arr(arr);
  286.  
  287. System.out.print("after bubble sorting: ");
  288. s.print_arr(s.bubble(arr));
  289.  
  290. System.out.print("after selection sorting: ");
  291. s.print_arr(s.selection(arr));
  292.  
  293. System.out.print("after insertion sorting: ");
  294. s.print_arr(s.insertion(arr));
  295.  
  296. System.out.print("after shell sorting: ");
  297. s.print_arr(s.shell(arr, arr.length/2));
  298.  
  299. System.out.print("after quick sorting: ");
  300. int dup[] = s.dup_arr(arr);
  301. s.quick(dup, 0, dup.length - 1);
  302. s.print_arr(dup);
  303.  
  304. System.out.print("after heap sorting: ");
  305. s.print_arr(s.heap(arr));
  306.  
  307. System.out.print("after counting sorting: ");
  308. s.print_arr(s.counting(arr));
  309.  
  310. //failure: because don't know how to define buckets
  311. //System.out.print("after radix sorting: ");
  312. //s.print_arr(s.radix(arr));
  313.  
  314. //failure: because don't know how to define buckets
  315. //System.out.print("after buckets sorting: ");
  316. //s.print_arr(s.buckets(arr));
  317.  
  318. System.out.print("after merge sorting: ");
  319. dup = s.dup_arr(arr);
  320. s.print_arr(s.merge_sort(dup, 0, dup.length - 1));
  321. }
  322. }

常见排序算法及其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实现

    package edu.cn.ysw; //八种排序算法的实现与效率分析 /* * 内排序的种类: * 1.插入排序:直接插入排序.希尔排序. * 2.选择排序:简单选择排序.堆排序. 3.交换排序: ...

  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. 使用委托的BeginInvoke方法来完成复杂任务的操作

    现在假设我有这样一个窗体(包含一个进度条和一个按钮与两个文本框),在第一个文本框中输入一个数字进行阶乘运算,在此过程中进度条与运算进度保持一致,同时可以在第二个文本框中进行其它工作(比如输入).对付这 ...

  2. [POJ 2429] GCD & LCM Inverse

    GCD & LCM Inverse Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10621   Accepted: ...

  3. MEX文件编写和调试

    作者kaien,2010/02/16 以前我写过一篇文章,详细的介绍过MEX的格式,语法,编译,调试等.可惜记不清放在哪里了.而最近又用到MEX编程,所以只能重新温习一番.时间有限,只记下简要流程和注 ...

  4. Kooboo CMS的安装步骤

    Kooboo CMS的安装步骤 来自Kooboo document 跳转到: 导航, 搜索 http://www.microsoft.com/web/gallery/install.aspx?appi ...

  5. 浏览器插件 - Chrome 对 UserScript 的声明头(metadata)兼容性一览

    1.这里的UserScript指的是,油猴插件或者Tampermonkey插件等支持的格式如下例子: // ==UserScript== // @name // @namespace http://A ...

  6. Ajax异步请求-简单模版

    <script type="text/javascript"> window.onload = function () { document.getElementByI ...

  7. faplayer编译配置经验

    最近在做在线m3u8类格式的视频直播应用, 在获取m3u8的文件之后,如果采用Android系统播放器来播,会有各种各样的问题,容易卡死.不连续,也不能自定义一些选项.查找资料以后,决定采用fapla ...

  8. 在生成 Visual c + + 2005年或从 DLL 文件中使用 CString 派生的类的 Visual c + +.net 应用程序时,您可能会收到 LNK2019 错误消息

    http://support.microsoft.com/kb/309801

  9. Android实例-设置消息提醒(XE8+小米2)

    相关资料: 1.官网实例:http://docwiki.embarcadero.com/RADStudio/XE5/en/Mobile_Tutorial:_Using_the_Notification ...

  10. PT100测温电路经验

    P100电压采集放大电路:前半部分是4.096V恒压源电路,然后是一个桥式电压采样电路,后面是一个电压放大电路. 一 4.096V恒压源电路: 因Vref = 2.5V,故有4.096 = (1 + ...