在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

Java对数组实现选择排序算法的实例详解

2016-7-29 15:41| 发布者: zhangjf| 查看: 560| 评论: 0

摘要: 一. 算法描述 选择排序:比如在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换......第N-1趟遍历剩下的2 ...

一. 算法描述
选择排序:比如在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换......第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成。
以下面5个无序的数据为例:
56 12 80 91 20(文中仅细化了第一趟的选择过程)
第1趟:12 56 80 91 20

201641485158319.jpg (336×307)

第2趟:12 20 80 91 56
第3趟:12 20 56 91 80
第4趟:12 20 56 80 91
二. 算法分析
平均时间复杂度:O(n2)
空间复杂度:O(1) (用于交换和记录索引)
稳定性:不稳定 (比如序列【5, 5, 3】第一趟就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)
三. 算法实现

  1. public class SelectionSort {
  2. public static void main(String[] args) {
  3. int len = 15;
  4. int[] ary = new int[len];
  5. Random random = new Random();
  6. for (int j = 0; j < len; j++) {
  7. ary[j] = random.nextInt(1000);
  8. }
  9. System.out.println("-------排序前------");
  10. // ary=new int[]{10,9,8,7,6,5,4,3,2,1}; //测试交换次数
  11. // ary=new int[]{1,2,3,4,5,6,7,8,10,9}; //测试交换次数
  12. for (int j = 0; j < ary.length; j++) {
  13. System.out.print(ary[j] + " ");
  14. }
  15. selectDesc(ary);
  16. selectAsc(ary);
  17. }
  18. /*
  19. * 选择排序:降序
  20. */
  21. static void selectDesc(int[] ary) {
  22. int compareCount = 0;//比较次数
  23. int changeCount = 0;//交换次数
  24. int len = ary.length;
  25. int maxValueIndex = -1; //记录一轮比较下来的最小值索引
  26. for (int i = 0; i < len - 1; i++) {
  27. maxValueIndex = i; //从0开始
  28. for (int j = i + 1; j < len; j++) {
  29. if (ary[maxValueIndex] < ary[j]) {
  30. maxValueIndex = j; //记录较大的索引
  31. compareCount++;
  32. }
  33. }
  34. // System.out.println("minValueIndex==" + maxValueIndex);
  35. if (maxValueIndex != i) {//如果跟左边的记录索引不同,则交换
  36. ary[i] = ary[maxValueIndex] + (ary[maxValueIndex] = ary[i]) * 0;//一步交换
  37. changeCount++;
  38. }
  39. }
  40. System.out.println("n-------降序排序后------比较次数:" + compareCount + ",交换次数" + changeCount);
  41. for (int j = 0; j < ary.length; j++) {
  42. System.out.print(ary[j] + " ");
  43. }
  44. }
  45. /*
  46. * 选择排序:升序
  47. */
  48. static void selectAsc(int[] ary) {
  49. int compareCount = 0, changeCount = 0;
  50. int len = ary.length;
  51. int minIndex = -1;
  52. for (int i = 0; i < len - 1; i++) {
  53. minIndex = i;
  54. for (int j = i + 1; j < len; j++) {
  55. if (ary[minIndex] > ary[j]) {
  56. minIndex = j; //记录较小的索引
  57. compareCount++;
  58. }
  59. }
  60. if (minIndex != i) {//如果跟左边的记录索引不同,则交换
  61. ary[i] = ary[minIndex] + (ary[minIndex] = ary[i]) * 0;
  62. changeCount++;
  63. }
  64. }
  65. System.out.println("n-------升序排序后------比较次数:" + compareCount + ",交换次数" + changeCount);
  66. for (int j = 0; j < ary.length; j++) {
  67. System.out.print(ary[j] + " ");
  68. }
  69. }
  70. }
复制代码

打印

  1. -------排序前------
  2. 125 350 648 789 319 699 855 755 552 489 187 916 596 731 852
  3. -------降序排序后------比较次数:26,交换次数13
  4. 916 855 852 789 755 731 699 648 596 552 489 350 319 187 125
  5. -------升序排序后------比较次数:56,交换次数7
  6. 125 187 319 350 489 552 596 648 699 731 755 789 852 855 916
复制代码

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-5-6 13:11

Copyright 2015-2025 djqfx

返回顶部