• Java学习笔记 第五天 数组与排序


    今天主要调试了数组及其排序方法,用了两种排序法:快排,堆排。由于部分语句较长,截图截不下,我先稍微总结两句,然后直接上输出和代码了

    总结:

    1.Java中的while,if等具有判断性的语句不支持while( (int)information )这样的写法,原因之前有说过:Boolean类型的值不接受0,1,只接受true,false。

    2.关于静态函数的使用:这里直接放个链接,这个博主写的非常好点击这里

    3.应有逻辑的创建类及其方法,这可以使程序结构非常清晰

    4.ArrayList 型数组可以直接输出:System.out.println(arr);

    5.arr.length用在多维数组上的话:

       int[][] arr = new int[][]{{1, 2, 3}, {4, 5, 6, 7}, {8, 9}};则arr.length的值为3,arr[1].length的值为4,arr[2].length的值为2;以此类推多维;

    6.ArrayList型数组无法直接访问与修改元素,前者需要.get(index)后缀,后者需要.set(index,targetNumber)后缀。如int t = arr.get(3),则t的值为arr数组下标为3的元素。再如arr.set(2, 9),则arr数组下标为2的元素被替换为数字9

    7.函数及其说明我放在代码里了,两个函数我之前都出过一期C++的博客:快排堆排;如果是和我一样有C基础的朋友们可以去看看。我用Java写的时候直接引用了ArrayList动态数组,但是未定义类型Type,我觉得用int做展示足够了,定义类型的好处与用法详见我堆排的那篇博客。

    输出:

    3b1ce578cdb04806a3a9ac16222ae864.png

     

    代码:

    1. /**
    2. * @author 阿白
    3. * @version v1.8
    4. * 希望毕业能直接找到工作,,,
    5. * */
    6. import java.util.*;
    7. public class HelloWorld {
    8. public static void main(String[] a) {
    9. System.out.println("今天主要测试各种数组与排序方式:\n");
    10. Test.arrayTest.normalArrTest();
    11. Test.sortTest.quickSortTest();
    12. Test.sortTest.heapSortTest();
    13. }
    14. }
    15. class Test{
    16. static class arrayTest{
    17. static void normalArrTest(){
    18. System.out.println("普通类型数组测试:");
    19. int[] arr1 = new int[]{1, 2, 4, 7, 3, 6, 9, 8, 0, 5};
    20. int[][] arr2 = new int[][]{{1, 4, 6, 7}, {9, 2, 5, 8}, {3, 0}};
    21. System.out.println("arr.length的使用:\n" +
    22. " arr1.length = " + arr1.length +
    23. " \narr2[0].length = " + arr2[0].length +
    24. " \narr2.length = " + arr2.length);
    25. System.out.println("\nArrayList类型数组测试:");
    26. ArrayList<Integer> arr3 = new ArrayList<>(Arrays.asList(1, 3, 6, 2, 7, 4, 8, 5, 9));
    27. System.out.println("添加元素:arr3.add()");
    28. arr3.add(0);
    29. System.out.println("删除元素:arr3.remove()");
    30. arr3.remove(2);//删除下标为2的元素
    31. System.out.println("修改元素:arr3.set(index, element)");
    32. arr3.set(2, 10);//将下标为2的元素修改为10
    33. System.out.println("查找元素:arr3.contains()");
    34. boolean ans = arr3.contains(8);//查找元素 8 是否存在
    35. };
    36. }
    37. static class sortTest{
    38. static void quickSortTest(){
    39. System.out.println("快速排序测试:");
    40. System.out.println("普通数组的快速排序:");
    41. int[] arr = new int[]{1, 2, 4, 7, 3, 6, 9, 8, 0, 5};
    42. System.out.println("原数组为:");
    43. for(int i = 0; i < 10; i++) System.out.print(arr[i] + " ");
    44. Sorts.normalQuickSort(arr, 0, 10, true);
    45. System.out.println("排序后为:");
    46. for(int i = 0; i < 10; i++) System.out.print(arr[i] + " ");
    47. System.out.println("\nArrayList数组的快速排序:");
    48. ArrayList<Integer> arr1 = new ArrayList<>(Arrays.asList(1, 3, 6, 2, 7, 4, 8, 5, 9, 0));
    49. System.out.println("原数组为:" + arr1);
    50. Sorts.arraysQuickSort(arr1, 0, 10, true);
    51. System.out.println("排序后为:" + arr1);
    52. System.out.println("\n查资料时有人说函数调用的全是副本,无法更改原数组的值,,但我用着也没事a,,");
    53. }
    54. static void heapSortTest(){
    55. System.out.println("普通数组不再尝试了。\nArrayList数组的堆排序:");
    56. ArrayList<Integer> arr2 = new ArrayList<>(Arrays.asList(1, 3, 6, 2, 7, 4, 8, 5, 9, 0));
    57. System.out.println("原数组为:" + arr2);
    58. Sorts.HeapSort.sort(arr2, 10, true);
    59. System.out.println("排序后为:" + arr2);
    60. System.out.println("\n返回值为ArrayList<Integer>的前k大问题测试:");
    61. ArrayList<Integer> arr3 = new ArrayList<>(Arrays.asList(1, 3, 6, 2, 7, 4, 8, 5, 9, 0));
    62. System.out.println("原数组为:" + arr3);
    63. ArrayList<Integer> arr4 = Sorts.HeapSort.topK(arr3, 10, 5, true);
    64. System.out.println("前 5 小为:" + arr4);
    65. arr4 = Sorts.HeapSort.topK(arr3, 10, 5, false);
    66. System.out.println("前 5 大为:" + arr4);
    67. }
    68. }
    69. }
    70. class Sorts{
    71. /*
    72. * 快排:instruct==true时,从小到大排序,反之从大到小
    73. * 堆排:堆排序:同快排;
    74. * TopK问题:instruct==true时,求前k小,从小到大排序;反之求前k大,从大到小排序
    75. * */
    76. static void normalQuickSort(int arr[], int left, int right, boolean instruct){
    77. if(left < right){
    78. int p = left;
    79. int index = p + 1;
    80. for(int i = index; i < right; i++){
    81. boolean judge = instruct ? arr[i] < arr[p] : arr[i] > arr[p];
    82. if(judge){
    83. int t = arr[i];
    84. arr[i] = arr[index];
    85. arr[index] = t;
    86. index++;
    87. }
    88. }
    89. int t = arr[p];
    90. arr[p] = arr[index - 1];
    91. arr[index - 1] = t;
    92. p = index - 1;
    93. normalQuickSort(arr, left, p, instruct);
    94. normalQuickSort(arr, p + 1, right, instruct);
    95. }
    96. }
    97. static void arraysQuickSort(ArrayList<Integer> arr, int left, int right, boolean instruct){
    98. if(left < right){
    99. int p = left;
    100. int index = p + 1;
    101. for(int i = index; i < right; i++){
    102. boolean judge = instruct ? arr.get(i) < arr.get(p) : arr.get(i) > arr.get(p);
    103. if(judge){
    104. int t = arr.get(i);
    105. arr.set(i, arr.get(index));
    106. arr.set(index, t);
    107. index++;
    108. }
    109. }
    110. int t = arr.get(p);
    111. arr.set(p, arr.get(index - 1));
    112. arr.set(index - 1, t);
    113. p = index - 1;
    114. arraysQuickSort(arr, left, p, instruct);
    115. arraysQuickSort(arr, p + 1, right, instruct);
    116. }
    117. }
    118. static class HeapSort{
    119. private static void down(ArrayList<Integer> arr, int parent, int size, boolean instruct){
    120. int child = parent * 2 + 1;
    121. while(child < size){
    122. boolean judge1 = false;
    123. if(child + 1 < size){//ins==true,构建大顶堆,否则构建小顶堆
    124. judge1 = instruct ? arr.get(child + 1) < arr.get(child) : arr.get(child + 1) > arr.get(child);
    125. }
    126. if(child + 1 < size && judge1){
    127. child++;
    128. }
    129. boolean judge2 = instruct ? arr.get(child) < arr.get(parent) : arr.get(child) > arr.get(parent);
    130. if(judge2){
    131. int t = arr.get(child);
    132. arr.set(child, arr.get(parent));
    133. arr.set(parent, t);
    134. parent = child;
    135. child = parent * 2 + 1;
    136. }
    137. else {
    138. break;
    139. }
    140. }
    141. }
    142. public static void sort(ArrayList<Integer> arr, int size, boolean instruct){
    143. for(int i = (size - 2) / 2; i >=0; i--){
    144. down(arr, i, size, instruct);
    145. }
    146. int end = size - 1;
    147. while(end > 0){
    148. int t = arr.get(0);
    149. arr.set(0, arr.get(end));
    150. arr.set(end, t);
    151. down(arr, 0, end, instruct);
    152. end--;
    153. }
    154. }
    155. public static ArrayList<Integer> topK(ArrayList<Integer> arr, int size, int k, boolean instruct){
    156. ArrayList<Integer> topKArray = new ArrayList<>();
    157. for(int i = 0; i < k; i++){
    158. topKArray.add(arr.get(i));
    159. }
    160. for(int i = (k - 2) / 2; i >= 0; i--){
    161. down(topKArray, i, k, !instruct);
    162. }
    163. for(int i = k; i < size; i++){
    164. boolean judge = instruct ? arr.get(i) < topKArray.get(0) : arr.get(i) > topKArray.get(0);
    165. if(judge){
    166. topKArray.set(0, arr.get(i));
    167. down(topKArray, 0, k, !instruct);
    168. }
    169. }
    170. sort(topKArray, k, !instruct);
    171. return topKArray;
    172. }
    173. }
    174. }

     

     

  • 相关阅读:
    目标检测评估指标mAP:从Precision,Recall,到AP50-95【未完待续】
    mui tap事件,mui.confirm弹窗出现两次
    如何善用项目管理工具做好 多项目管理
    电脑硬件——硬盘
    SpringAop实现原理及代理模式
    SaaS是什么?
    7月的目标
    C高级作业 【使用shell脚本】 实现一个对数组求和的函数,数组通过实参传递给函数+写一个函数输出当前用户的uid和gid,并使用变量接收结果
    洛谷千题详解 | P1012 [NOIP1998 提高组] 拼数【C++、Java语言】
    TS(五):装饰器
  • 原文地址:https://blog.csdn.net/bairimeng16/article/details/124993763