[关闭]
@LIUHUAN 2019-04-08T09:52:05.000000Z 字数 2521 阅读 806

排序实现

algorithm


排序算法实现

  1. package com.sort;
  2. public class SortLearn {
  3. public static void main(String[] args) {
  4. int [] A = new int[] {1,3,2,10,5,4,-1,6};
  5. // int [] A = new int[] {1,2,-1,6};
  6. // insert_sort(A);
  7. // select_sort(A);
  8. // bubble_sort(A);
  9. // merge_sort(A,0,A.length-1);
  10. quick_sort(A,0,A.length-1);
  11. print(A);
  12. }
  13. // 快速排序
  14. // 划分:
  15. // 递归排序
  16. public static void quick_sort(int []A,int l,int r) {
  17. if(l >= r)// 递归出口,只有一个元素的数组一定是有序的
  18. return ;
  19. int k = partition(A,l,r); // 划分数组,A[k] 左边比A[k]小,右边不大于A[k]
  20. quick_sort(A,l,k-1); // 分别对两边进行排序
  21. quick_sort(A,k+1,r);
  22. }
  23. // 快排,分割数组
  24. private static int partition(int[] A, int l, int r) {
  25. int p = A[l];
  26. int i =l,j = r;
  27. while(i < j) {
  28. while(i < j && A[j] >= p ) // 从右边查找一个比p小的元素,放置到p的前面
  29. j--;
  30. if(i < j)
  31. A[i] = A[j];
  32. while(i < j && A[i] < p) // 左边查找一个比p大的元素,放到p的后面
  33. i++;
  34. if(i < j)
  35. A[j] = A[i];
  36. }
  37. A[i] = p;// 放置p,这个时候A[l,i) 小于p,A[i,r]不小于p,数组从p这个位置看,左右两边大致是两类数据了
  38. return i; // p的位置
  39. }
  40. // 归并排序
  41. // 划分:直到最小的单位一个元素的数组时
  42. // 合并:合并有序数组
  43. public static void merge_sort(int[] A,int l,int r) {
  44. if(l >= r) // 递归的出口,只有一个元素时,不需要在递归了
  45. return;
  46. int k = (l + r ) / 2; // 把数据一分为2
  47. merge_sort(A, l, k); // A[l,k] 进行递归排序
  48. merge_sort(A, k+1, r); // A[k+1,r] 递归排序
  49. // 下面是合并两个排序数组的过程,可以参见merge函数
  50. int [] B = new int[r - l + 1];// 新建立一个数组
  51. int c = 0;
  52. int i = l, j = k + 1;
  53. while(i <= k && j <= r) { // 合并两个数组,选择较小的那个放置B中
  54. if(A[i] < A[j]) {
  55. B[c++] = A[i++];
  56. }else {
  57. B[c++] = A[j++];
  58. }
  59. }
  60. // 可能A[i] 数据还有
  61. while(i <= k) {
  62. B[c++] = A[i++];
  63. }
  64. // 可能A[j] 数据还有
  65. while(j <= r) {
  66. B[c++] = A[j++];
  67. }
  68. // 把B中数据复制到A中[l,r]
  69. c = 0;
  70. while(l <= r) {
  71. A[l++] = B[c++];
  72. }
  73. }
  74. // 归并合并两个有序数组
  75. public static void merge(int []A,int l,int k,int r) {
  76. int [] B = new int[r-l+1];
  77. int c = 0;
  78. int i = l,j = k+1;
  79. while(i <= k && j <= r) {
  80. if(A[i] < A[j]) {
  81. B[c++] = A[i++];
  82. }else {
  83. B[c++] = A[j++];
  84. }
  85. }
  86. while(i <= k) {
  87. B[c++] = A[i++];
  88. }
  89. while(j <= r) {
  90. B[c++] = A[j++];
  91. }
  92. c = 0;
  93. while(l <= r) {
  94. A[l++] = B[c++];
  95. }
  96. }
  97. public static void print(int[] A) {
  98. // System.out.println(A);
  99. for(int x:A) {
  100. System.out.printf("%d ",x);
  101. }
  102. System.out.println();
  103. }
  104. /// 冒泡排序
  105. public static void bubble_sort(int [] A) {
  106. int n = A.length;
  107. for(int i =0;i < n;i++) {// 排序趟数,因每次会冒出最大的一个数到最终排序好的位置上
  108. for(int j = 0;j < n-i-1;j++) { // 第i趟排序时,(n-i-1,n)的位置上已经是排序好的数据了
  109. if(A[j] > A[j+1]) {// 如果前面的比后面的大,则交换两个数,让大的数据往后冒
  110. int t = A[j];
  111. A[j] = A[j+1];
  112. A[j+1] = t;
  113. }
  114. }
  115. }
  116. print(A);
  117. }
  118. // 插入排序
  119. public static void insert_sort(int [] A) {
  120. int n = A.length;
  121. for (int i =0 ;i < n;i++) {// 对A[i] 执行插入排序,i = 0 其实可以不用参加排序,因为就它自己一个元素,已经是有序的了
  122. int key = A[i];// 保存要排的数据
  123. int j;
  124. for( j = i-1; j >= 0; j--) { // 从[i-1,0] 查找一个A[i]能够正确放置的位置
  125. if(A[j] > key) { //
  126. A[j+1] = A[j]; // 前面的一个元素往后移动一位,腾出空间
  127. }else {
  128. break;
  129. }
  130. }
  131. A[j+1] = key; // 把A[i] 放置到查找到的位置上
  132. }
  133. print(A);
  134. }
  135. // 选择排序
  136. public static void select_sort(int[] A) {
  137. int n = A.length;
  138. for(int i = 0; i < n; i++) { // 选择排序的排序趟数
  139. int min = A[i]; // 假设A[i] 是最小的元素,从[i,n) 查找最小的元素
  140. int min_index = i; // 记录最小元素的索引
  141. for(int j = i + 1; j < n; j++) { // 已经假设A[i]最小,那么可以从[i+1,n) 查找最小的元素
  142. if(A[j] < min) { // 记录最小元素的位置和值
  143. min = A[j];
  144. min_index = j;
  145. }
  146. }
  147. if(min_index != i) { // 如果A[i] 不是最小元素,那么交换两个数
  148. int t = A[i];
  149. A[i] = A[min_index];
  150. A[min_index] = t;
  151. }
  152. }
  153. print(A);
  154. }
  155. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注