内容:
题目:
归并排序的递归和非递归实现
递归版本的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| public class MergeSort {
public static void main(String[] args) { for (int i = 0; i < 5000; i++) { int[] arr = ArrayTools.generateRandomArray2(12, 15, true); mergeSort(arr); ArrayTools.printArr(arr); boolean isAsc = ArrayTools.isAsc(arr); if (!isAsc){ System.out.println("出错了"); break; } }
System.out.println("AC");
}
public static void mergeSort(int[] arr) { if (arr == null || arr.length <= 2) { return; } process(arr, 0, arr.length - 1); }
public static void process(int[] arr, int l, int r) { if (l == r) { return; } int mid = l + ((r - l) >> 2); process(arr, l, mid); process(arr, mid + 1, r); merge(arr, l, mid, r); }
public static void merge(int[] arr, int l, int mid, int r) {
int[] help = new int[r - l + 1]; int i = 0; int p1 = l; int p2 = mid + 1; while (p1 <= mid && p2 <= r) { help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++]; } while (p1 <= mid) { help[i++] = arr[p1++]; } while (p2 <= r) { help[i++] = arr[p2++]; } for (int j = 0; j < help.length; j++) { arr[l + j] = help[j]; } }
}
|
非递归版本的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| public class MergeSort1 {
public static void mergeSort2(int arr[]) {
if (arr == null || arr.length < 2) { return; } int len = arr.length; int mergeSize = 1; while (mergeSize < len) { int l, mid, r; l = 0;
while (l < len) { mid = l + mergeSize - 1; r = Math.min(len - 1, mid + mergeSize); merge(arr, l, mid, r);
l = r + 1; } if (mergeSize / 2 > len) { break; } mergeSize <<= 1; }
}
public static void merge(int arr[], int l, int mid, int r) {
int help[] = new int[r - l + 1]; int i = 0;
int p1 = l;
int p2 = mid + 1; while (p1 <= mid && p2 <= r) { help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++]; }
while (p1 <= mid) { help[i++] = arr[p1++]; } while (p2 <= r) { help[i++] = arr[p2++]; }
for (int j = 0; j < help.length; j++) { arr[l + j] = help[j]; } }
public static void main(String[] args) {
for (int i = 0; i < 5000; i++) { int arr[] = ArrayTools.generateRandomArray2(12, 14, true); mergeSort2(arr); ArrayTools.printArr(arr); ArrayTools.validArrAsc(arr); } ArrayTools.AC(); } }
|
在一个数组中,一个数左边比它小的数的总和,叫该数的小和
所有数的小和累加起来,叫数组小和
例子: [1,3,4,2,5]
1左边比1小的数:没有
3左边比3小的数:1
4左边比4小的数:1、3
2左边比2小的数:1
5左边比5小的数:1、3、4、 2
所以数组的小和为1+1+3+1+1+3+4+2=16
给定一个数组arr,求数组小和
在一个数组中,任何一个前面的数a,和任何一个后面的数b,如果(a,b)是降序的,就称为降序对
给定一个数组arr,求数组的降序对总数量
在一个数组中,对于任何一个数num,求有多少个(后面的数*2)依然<num,返回总个数
比如:[3,1,7,0,2]
3的后面有:1,0
1的后面有:0
7的后面有:0,2
0的后面没有
2的后面没有
所以总共有5个
条评论