关于冒泡排序和选择排序的理解

294 阅读1分钟

冒泡排序

每次相邻两个元素进行比较, 较大的放后面。每次循环可以得到最大值。

  int[] numArray = {5, 7, 5, 3, 8};
  for (int i = 0; i < (numArray.length - 1); i++)
  {
      for (int j = 0; j < (numArray.length - 1 - i); j++)
      {
          if (numArray[j] > numArray[j + 1])
          {
              int temp = numArray[j];
              numArray[j] = numArray[j + 1];
              numArray[j + 1] = temp;
          }
      }
  }

选择排序

每次拿第一个位置和后面所有的元素依次进行比较,如果后面的元素小,就和第一个位置交换位置,每次循环可以得到最小值。

  int[] numArray = {5, 7, 5, 3, 8};
  for (int i = 0; i < (numArray.length - 1); i++)
  {
      int changeIndex = i;
      for (int j = (i + 1); j < numArray.length; j++)
      {
          if (numArray[j] < numArray[changeIndex])
          {
              changeIndex = j;
          }
      }

      if (changeIndex != i)
      {
          int temp =  numArray[i];
          numArray[i] = numArray[changeIndex];
          numArray[changeIndex] = temp;
      }
  }

区别

  1. 两者时间复杂度都为O(n^2), 选择排序每次循环只会发生一次交换,而冒泡在最坏情况每次循环会发生(n - 1)次交换。
  2. 但是选择排序是不稳定的, 而冒泡排序是稳定的! 比如上述示例,选择排序的第一个5会跟3发生交换,此时原数组中两个5的先后次序已发生改变。而冒泡是两两交换,所以不会发生此问题。