Java 排序算法:归并排序、阶乘、直接插入排序、冒泡排序、选择排序等算法

朱雀 2021-03-16 15:35 838阅读 0赞

图解

495676-20170310141521373-669264928.png


1. 选择排序

  1. /*
  2. * 选择排序
  3. *
  4. * 在未排序序列中找到最小元素,存放到排序序列的起始位置 再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。
  5. * 以此类推,直到所有元素均排序完毕。
  6. */
  7. int[] num = {2,3,1,5,4};
  8. //控制遍历次数
  9. for (int i = 0; i < num.length-1; i++) {
  10. //记录每次遍历的起始下标位置,默认为最小值
  11. int minIndex = i;
  12. for (int j = i+1; j < num.length; j++) {
  13. if (num[j]<num[minIndex]) {
  14. minIndex = j;
  15. }
  16. }
  17. //每次遍历结束,最小值和起始位置互换值
  18. int temp = num[i];
  19. num[i] = num[minIndex];
  20. num[minIndex] = temp;
  21. }
  22. //打印输出
  23. for (int i : num) {
  24. System.out.print(i+"\t");
  25. }

2. 冒泡排序

  1. /*
  2. * 冒泡排序
  3. *
  4. * 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  5. * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  6. * 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
  7. */
  8. int[] num1 = {1,3,4,6,2,11,19,2,7,0};
  9. // 控制遍历次数
  10. for (int i = 0; i < num1.length-1; i++) {
  11. int temp = 0;
  12. //控制每次遍历比较次数
  13. for (int j = 0; j < num1.length-1; j++) {
  14. //如果后一个数更小就和前一个数交换值
  15. if (num1[j+1]<num1[j]) {
  16. temp = num1[j];
  17. num1[j] = num1[j+1];
  18. num1[j+1] = temp;
  19. }
  20. }
  21. //打印每次遍历之后的数组
  22. System.out.println("第"+(i+1)+"次遍历后的数组:");
  23. for (int j : num1) {
  24. System.out.print(j+" ");
  25. }
  26. System.out.println();
  27. }
  28. //输出
  29. System.out.println("经过冒泡排序后的数组:");
  30. for (int i : num1) {
  31. System.out.print(i+" ");
  32. }

3. 直接插入排序

  1. /*
  2. * 直接插入排序
  3. *
  4. * 从第一个元素开始,该元素可以认为已经被排序
  5. * 取出下一个元素,在已经排序的元素序列中从后向前扫描
  6. * 如果前面元素大,则前面元素向后移一位
  7. * 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  8. * 将新元素插入到该位置中
  9. * 重复步骤2
  10. */
  11. int[] num2 = {3, 4, 2, 1, 5, 6, 9, 8, 7, 0 };
  12. //控制遍历次数
  13. for (int i = 1; i < num2.length; i++) {
  14. int temp = num2[i];
  15. int j = i;
  16. for (j = i; j > 0 && temp < num2[j-1]; j--) {
  17. //num[2] = 2时
  18. //j=2;num2[2]=num2[1];3 4 4 ...;j=1;继续内层循环
  19. //j=1;num2[1]=num2[0];3 3 4 ...;j=0;跳出内层循环
  20. num2[j] = num2[j-1];
  21. }
  22. //j=0;num[0]=2;2,3,4...
  23. num2[j] = temp;
  24. //打印每次移动后的数组
  25. System.out.println("第"+i+"次移动后的数组:");
  26. for (int k : num2) {
  27. System.out.print(k+" ");
  28. }
  29. System.out.println();
  30. }
  31. //输出
  32. System.out.println("经过直接插入排序之后的数组:");
  33. for (int i : num2) {
  34. System.out.print(i+" ");
  35. }

4. 阶乘

  1. /*
  2. * 阶乘的方法递归算法
  3. *
  4. * 1! = 1
  5. * 2! = 2 x 1 = 2 x 1!
  6. * 3! = 3 x 2 x 1 = 3 x 2!
  7. * 4! = 4 x 3 x 2 x 1 = 4 x 3!
  8. * ......
  9. */
  10. static int factorial(int n) {
  11. // return n*(n-1)!
  12. if (n < 1) {
  13. return 0;
  14. }
  15. if (n == 1) {
  16. return 1;
  17. } else {
  18. return n * factorial(n - 1);
  19. }
  20. }

5. 归并排序

05145558-282c2629e8a4428281a65f25603d8895.jpg

  1. /*
  2. (1)申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  3. (2)设定两个指针,最初位置分别为两个已经排序序列的起始位置
  4. (3)比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  5. (4)重复步骤3直到某一指针达到序列尾
  6. (5)将另一序列剩下的所有元素直接复制到合并序列尾
  7. */
  8. public static void merge(int[] num, int low, int mid, int high) {
  9. int[] temp = new int[high - low + 1];
  10. int left = low;// 左边数组的起始位置
  11. int right = mid + 1;// 右边数组的起始位置
  12. int index = 0;
  13. // 比较拆分的两个子数组,依次取最小值,放入新数组,并移动指针到后一位
  14. while (left <= mid && right <= high) {
  15. if (num[left] < num[right]) {
  16. temp[index++] = num[left++];
  17. } else {
  18. temp[index++] = num[right++];
  19. }
  20. }
  21. // 把左边剩余的数移入数组
  22. while (left <= mid) {
  23. temp[index++] = num[left++];
  24. }
  25. // 把右边边剩余的数移入数组
  26. while (right <= high) {
  27. temp[index++] = num[right++];
  28. }
  29. // 把新数组中的数覆盖nums数组
  30. for (int i = 0; i < temp.length; i++) {
  31. num[i + low] = temp[i];
  32. }
  33. System.out.println(Arrays.toString(temp));
  34. }
  35. public static int[] mergeSort(int[] num, int low, int high) {
  36. int mid = (low + high) / 2;
  37. if (low < high) {
  38. // 递归拆分左边
  39. mergeSort(num, low, mid);
  40. // 递归拆分右边
  41. mergeSort(num, mid + 1, high);
  42. // 左右归并,将拆分的有序数组排序
  43. merge(num, low, mid, high);
  44. System.out.println(Arrays.toString(num));
  45. }
  46. return num;
  47. }
  48. public static void main(String[] args) {
  49. int[] num3 = {14,12,15,13,11,16};
  50. int[] num0 = mergeSort(num3, 0, num3.length-1);
  51. System.out.println("排序结果:" + Arrays.toString(num0));
  52. }

发表评论

表情:
评论列表 (有 0 条评论,838人围观)

还没有评论,来说两句吧...

相关阅读