排序算法是数据结构中的经典算法知识点,也是笔试面试中经常考察的问题,平常学的不扎实笔试时候容易出洋相,回来恶补,尤其是碰到递归很可能被问到怎么用非递归实现。。。

内部排序:

插入排序:直接插入排序

选择排序:直接选择排序

交换排序:冒泡排序,改进的冒泡排序;快速排序,非递归实现快速排序

//堆排序:。。。

//归并排序:。。。

  1. import java.util.Stack;
  2.  
  3. public class SortTest {
  4.  
  5. /**
  6. * 插入排序:假定指针所指数据之前的序列为有序,所要做的便是将之后的数据插入到之前的有序序列中,
                具体做法是从后往前比较指针前序列与指针所指数据的大小,如果前者大于后者,则将前者后移一
                位(也可以将其与前面一位交换),在向前比较,直至前者不大于前者,此时插入数据。
  7. * @param a
  8. */
  9. public static void insertSort(int[] a){
  10. if(a!=null){
  11. int temp,j;
  12. for(int i=1;i<a.length;i++){
  13. temp = a[i];
  14. j=i;
  15. if(a[j-1]>temp){
  16. while(j>=1&&a[j-1]>temp){
  17. a[j] = a[j-1];
  18. j--;
  19. }
  20. a[j] = temp;
  21. }
  22. }
  23. }
  24. }
  25.  
  26. /**
  27. * 直接选择排序
  28. * @param a
  29. */
  30. public static void selectSort(int[] a){
  31. int i,j;
  32. int temp = 0;
  33. int flag = 0;
  34. int n = a.length;
  35. for(i=0;i<n;i++){
  36. temp = a[i];
  37. flag = i;
  38. for(j=i+1;j<n;j++){
  39. if(a[j]<temp){
  40. temp = a[j];
  41. flag = j;
  42. }
  43. }
  44. if(flag!=i){
  45. a[flag] = a[i];
  46. a[i] = temp;
  47. }
  48. }
  49. }
  50.  
  51. /**
  52. * 冒泡排序
  53. * @param a
  54. */
  55. public static void bubbleSort(int[] a){
  56. int i,j;
  57. int len = a.length;
  58. int tmp;
  59. for(i=0;i<len;i++){
  60. for(j=0;j<len-i-1;j++){
  61. if(a[j+1]<a[j]){
  62. tmp = a[j];
  63. a[j] = a[j+1];
  64. a[j+1] = tmp;
  65. }
  66. }
  67. }
  68.  
  69. }
  70. /**
  71. * 改进冒泡
  72. * @param arr
  73. */
  74. public void EffectBubbleSort(int[] arr, int low, int high){
  75. int i,j;
  76. boolean flag = true;
  77. //ture表明上一趟有交换,如果为false表明无交换已经有序,停止循环
  78. for(i=low; i<high && flag; i++){
  79. flag = false;
  80. for(j=high-1; j>=i; j--){
  81. if(arr[j-1]>arr[j]){
  82. int temp = arr[j];
  83. arr[j] = arr[j-1];
  84. arr[j-1] = temp;
  85. flag = true;
  86. }
  87. }
  88. }
  89. }
  90. /**
  91. * 快速排序:
  92. * 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都小,
  93. * 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
  94. * @param a
  95. * @param low
  96. * @param high
  97. */
  98. public static void sort(int[] a, int low, int high){
  99. int i,j;
  100. int index;
  101. if(low>=high)
  102. return;
  103. i = low;
  104. j = high;
  105. index = a[i];
  106. while(i<j){
  107. while(i<j&&a[j]>=index)
  108. j--;
  109. if(i<j)
  110. a[i++] = a[j];
  111. while(i<j&&a[i]<index)
  112. i++;
  113. if(i<j)
  114. a[j--] = a[i];
  115.  
  116. }
  117. a[i] = index;
  118. sort(a, low, i-1);
  119. sort(a, i+1, high);
  120. }
  121. /**
  122. * 快速排序另一种实现,
  123. * @param a
  124. * @param start
  125. * @param end
  126. */
  127. public static void qsort(int data[], int start, int end) {
  128. if (end <= start) {
  129. return;
  130. }
  131. int last = start;
  132. for (int i = start + 1; i <= end; i++) {
  133. if (data[i] < data[start]) {
  134. int temp = data[++last];
  135. data[last] = data[i];
  136. data[i] = temp;
  137. }
  138. }
  139. int temp = data[last];
  140. data[last] = data[start];
  141. data[start] = temp;
  142. sort(data, start, last - 1);
  143. sort(data, last + 1, end);
  144. }
  145. /**
  146. * 快速排序非递归,参考
  147. * @param array
  148. * @author http://computerdragon.blog.51cto.com/6235984/1305987
  149. */
  150. public void quicksort(int[] array) {
  151. if (array == null || array.length == 1) return;
  152. //存放开始与结束索引
  153. Stack<Integer> s = new Stack<Integer>();
  154. //压栈
  155. s.push(0);
  156. s.push(array.length - 1);
  157. //利用循环里实现
  158. while (!s.empty()) {
  159. int right = s.pop();
  160. int left = s.pop();
  161. //如果最大索引小于等于左边索引,说明结束了
  162. if (right <= left) continue;
  163.  
  164. int i = partition(array, left, right);
  165. if (left < i - 1) {
  166. s.push(left);
  167. s.push(i - 1);
  168. }
  169. if (i + 1 < right) {
  170. s.push(i+1);
  171. s.push(right);
  172. }
  173. }
  174. }
  175. //找到轴心,进行交换,上面qsort()中扫描交换的实现也可行
  176. public int partition (int[] data, int first, int end)
  177. {
  178. int temp;
  179. int i=first,j=end;
  180. if(first<end)
  181. {
  182. temp=data[i];
  183. //当i=j的时候,则说明扫描完成了
  184. while(i<j)
  185. {
  186. //从右边向左边扫描找到一个小于temp的元素
  187. while(j>i&&data[j]>temp)j--;
  188. if(i<j)
  189. {
  190. //将该元素赋值给temp
  191. data[i]=data[j];
  192. //赋值后就应该将i+1指向下一个序号
  193. i++;
  194. }
  195.  
  196. //然后从左边向右边开始扫描,找到一个大于temp的元素
  197. while(i<j&&temp>data[i])i++;
  198. if(i<j)
  199. {
  200. //将该元素赋值给temp
  201. data[j]=data[i];
  202. //赋值后就应该将j-1指向前一个序号
  203. j--;
  204. }
  205. }
  206. //将轴数据放在i位置中
  207. data[i]=temp;
  208. }
  209. return i;
  210.  
  211. }
  212.  
  213.   

排序算法练习--JAVA(:内部排序:插入、选择、冒泡、快速排序)的更多相关文章

  1. 几种排序算法及Java实现排序的几种方式

    几种排序算法 下面的例子介绍了4种排序方法: 冒泡排序, 选择排序, 插入排序, 快速排序 package date201709.date20170915; public class SortUtil ...

  2. 基础排序算法,java实现(快速,冒泡,选择,堆排序,插入)

    1.冒泡排序: (1)比较相邻的元素.如果第一个比第二个大,就交换他们两个. (2)外面再套个循环就行. 算法复杂度:O(N2)   不罗嗦,上代码: //冒泡排序(两两交换,外加一个外循环) pub ...

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

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

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

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

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

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

  6. 排序算法及其java实现

    各种排序算法:冒择路(入)兮(稀)快归堆,桶式排序,基数排序 冒泡排序,选择排序,插入排序,稀尔排序,快速排序,归并排序,堆排序,桶式排序,基数排序 一.冒泡排序(BubbleSort) 1. 基本思 ...

  7. 8大排序算法的java实现--做个人收藏

    排序算法分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因为数据量太大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.这里只讨论内部排序,常见的内部排序算法有:插入排序 ...

  8. 几大排序算法的Java实现

    很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...

  9. 7种基本排序算法的Java实现

    7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 /** * 直接插 ...

  10. 七种经典排序算法及Java实现

    排序算法稳定性表示两个值相同的元素在排序前后是否有位置变化.如果前后位置变化,则排序算法是不稳定的,否则是稳定的.稳定性的定义符合常理,两个值相同的元素无需再次交换位置,交换位置是做了一次无用功. 下 ...

随机推荐

  1. redis编译问题

    在编译redis时,出现以下问题 In file included from adlist.c:34:0: zmalloc.h:50:31: fatal error: jemalloc/jemallo ...

  2. 二叉树分派硬币 Distribute Coins in Binary Tree

    2019-03-27 15:53:38 问题描述: 问题求解: 很有意思的题目.充分体现了二叉树的自底向上的递归思路. 自底向上进行运算,对于最底层的二叉子树,我们需要计算每个节点向其parent传送 ...

  3. Mysql增量恢复

    mysqldump增量恢复何时需要使用备份的数据? 备份最牛逼的层次,就是永远都用不上备份.--老男孩 不管是逻辑备份还是物理备份,备份的数据什么时候需要用?===================== ...

  4. linux存储管理之磁盘阵列

    磁盘阵列 RAID ====================================================================================RAID:廉 ...

  5. python-html基础操作

    介绍: HTML  是网页内容的载体.包括文字,图片,信息等用户浏览的信息CSS   样式是改变内容外观表现.像字体,颜色,背景,边框等JavaScript   是实现网页上的特效效果.如鼠标滑过背景 ...

  6. spring El

    package com.wisely.heighlight_spring4.ch2.el; import java.io.IOException; import org.apache.commons. ...

  7. 『Python』源码解析_源码文件介绍

    本篇代码针对2.X版本,与3.X版本细节不尽相同,由于两者架构差别不大加之本人能力有限,所以就使用2.X体验python的底层原理了. 一.主要文件夹内容 Include :该目录下包含了Python ...

  8. 『PyTorch × TensorFlow』第十七弹_ResNet快速实现

    『TensorFlow』读书笔记_ResNet_V2 对比之前的复杂版本,这次的torch实现其实简单了不少,不过这和上面的代码实现逻辑过于复杂也有关系. 一.PyTorch实现 # Author : ...

  9. MVC 简介

     是AOP (Aspect-Oriented Programming.面向侧 面的程序设计或面向方面的程序设计,是对面向对象程序设计的改进和扩展)内的概念 当 一 件事被细分为各个单元后,各个单元的复 ...

  10. js各种特效轮播图,选项卡,放大镜,窗口拖拽,楼层跳转

    // 透明度轮播图 // img:轮播图片 // dot:轮播点 // lbtn:左箭头 // rbtn:右箭头 // banner:轮播盒子 // active:轮播点选中效果类名 // time: ...