描述

给定一个数组,请你编写一个函数,返回该数组排序后的形式。

示例1

  1. 输入:
  2. [5,2,3,1,4]
  3. 返回值:
  4. [1,2,3,4,5]

备注:

数组的长度不大于100000,数组中每个数的绝对值不超过10^9

  1. //提供四种排序思想
  2. public class Solution {
  3. /**
  4. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
  5. * 将给定数组排序
  6. * @param arr int整型一维数组 待排序的数组
  7. * @return int整型一维数组
  8. */
  9. public int[] MySort (int[] arr) {
  10. // write code here
  11. quickSort(arr);
  12. return arr;
  13. }
  14. //交换两个数组元素
  15. public void swapArr(int[] arr,int index1,int index2) {
  16. int i = arr[index2];
  17. arr[index2] = arr[index1];
  18. arr[index1] = i;
  19. }
  20. //选择排序
  21. public void selectionSort(int[] arr) {
  22. for(int i = 0;i<arr.length;i++) {
  23. //寻找(i,arr.length]之间的最小值
  24. int minIndex = i;
  25. for(int j = i+1;j<arr.length;j++) {
  26. if(arr[j]<arr[minIndex]) {
  27. minIndex = j;
  28. }
  29. }
  30. swapArr(arr,i,minIndex);
  31. }
  32. }
  33. //将arr[l..mid] 和 arr[mid+1 ... r]两部分进行归并
  34. private static void __merge(int[] arr,int l,int mid, int r) {
  35. int[] aux = new int[r-l+1];
  36. //将排序的空间赋值给aux
  37. int i;
  38. for(i = l;i <= r;i++) {
  39. aux[i-l] = arr[i];
  40. }
  41. i=l;
  42. int j = mid+1;
  43. //归并排序
  44. for(int k = l;k <= r;k++) {
  45. //1 看i j 是否越界
  46. if(i>mid) {
  47. arr[k] = aux[j-l];
  48. j++;
  49. }else if(j>r) {
  50. arr[k] = aux[i-l];
  51. i++;
  52. }else {
  53. if(aux[i-l]<aux[j-l]) {
  54. arr[k] = aux[i-l];
  55. i++;
  56. }else {
  57. arr[k] = aux[j-l];
  58. j++;
  59. }
  60. }
  61. }
  62. }
  63. //递归使用归并排序,对arr[l..r] 的范围进行排序
  64. private static void __mergeSort(int[] arr,int l,int r) {
  65. //结束条件
  66. if(l >= r) {
  67. return;
  68. }
  69. //求中点位置
  70. int mid = (l+r)/2;
  71. __mergeSort(arr,l,mid);
  72. __mergeSort(arr,mid+1,r);
  73. //进行最后排序
  74. __merge(arr,l,mid,r);
  75. }
  76. //归并排序
  77. public static void mergeSort(int[] arr) {
  78. //对arr[l..r] 的范围进行排序
  79. __mergeSort(arr,0,(arr.length)-1);
  80. }
  81. //对arr[l...r] 部分进行partiton 操作
  82. //返回p 使得arr[l...p-1] <arr[p] arr[p+1 ...r] >arr[p]
  83. private int __partition(int[] arr,int l, int r) {
  84. int v = arr[l];
  85. // j的值指向第一个大于V的值的下标
  86. int j = l+1;
  87. // 遍历整个数组 一直到 i<= r 时候结束
  88. for(int i = l+1;i<=r;i++) {
  89. if(arr[i] < v) {
  90. swapArr(arr, i,j);
  91. j++;
  92. }
  93. }
  94. swapArr(arr, l, j-1);
  95. return j-1;
  96. }
  97. //对arr[l...r] 部分进行快速排序
  98. private void __quickSort(int[] arr,int l,int r) {
  99. if(l>=r) {
  100. return;
  101. }
  102. int p = __partition(arr,l,r);
  103. __quickSort(arr, l, p-1);
  104. __quickSort(arr, p+1, r);
  105. }
  106. //快速排序
  107. public void quickSort(int[] arr) {
  108. __quickSort(arr,0,arr.length-1);
  109. }
  110. private void __quickSort3Ways(int[] arr,int l,int r) {
  111. if(r-l<=15) {
  112. insertionSort(arr);
  113. return;
  114. }
  115. Random ra = new Random();
  116. swapArr(arr, l, ra.nextInt(r-l)+l);
  117. int v = arr[l];
  118. //__partition3Ways(arr,r,l);
  119. //partiton3Ways
  120. int lt = l;
  121. int gt = r;
  122. int i = l+1;
  123. while(i<gt){
  124. if(arr[i]>v) {
  125. swapArr(arr, i, gt);
  126. gt--;
  127. }else if(arr[i]<v) {
  128. swapArr(arr, i, lt+1);
  129. i++;
  130. lt++;
  131. }else {
  132. i++;
  133. }
  134. }
  135. swapArr(arr, l, lt);
  136. __quickSort3Ways(arr,l,lt-1);
  137. __quickSort3Ways(arr,gt,r);
  138. }
  139. //三路快速排序
  140. public void quickSort3Ways(int[] arr) {
  141. __quickSort3Ways(arr,0,arr.length-1);
  142. }
  143. //插入排序
  144. public void insertionSort(int[] arr) {
  145. for(int i = 1; i<arr.length;i++) {
  146. //寻找元素arr[i]合适的插入位置
  147. int j;
  148. for(j = i;j>0;j--) {
  149. if(arr[j] < arr[j-1]) {
  150. //使用交换 需要赋值三次
  151. swapArr(arr, j, j-1);
  152. }else {
  153. break;
  154. }
  155. }
  156. }
  157. }
  158. }

image.png