选择排序_选择排序

排序系列:
冒泡排序


选择排序(Select Sort) 是直观的排序,通过一个中间量从带排序的的数中找出最大或最小的交换到对应位置。再选择次之。选择排序和冒泡排序一样,都有两层循环。

让我们通过动态图来看一下选择排序的过程图:

选择排序_选择排序_02


让我们通过动态图来看一下选择排序的过程图:

这个动态图演示了一个无序数组使用选择排序转变为一个从大到小的有序数组,让我们来观察一下,在进入内循环之前,会记录一个值,这个值是当前外层循环A[i]的值,之后拿着这个值,在内循环遍历数组的时候,跟数组的元素一个一个的比较,如果这个值比当前下标的元素的大,那么就双方的值继续交换,内循环完成后,将这个值再赋值给A[i],经过内循环怎么一折腾,最后A[i]一定是拿到最小或者最大的值。

和冒泡排序不一样的是冒泡排序如果两个不一样当场就交换,而选择排序是将值给了一个中间变量,让这个中间变量加入内循环,等内循环结束,把真正最大或者最小的值赋值给外出循环的A[i]。


选择排序原理总结

[1]记录数组第一个元素的值(数组长度n)。

[2]遍历n-1次,用该值与其他元素比较,找到最大或者最小的一个数交换。

[3]记录数组第二个元素的值。

[4]遍历n-2次,用该值与其他元素比较,找到最大或者最小的一个数交换。

[5]重复上述步骤,遍历N次,直到没有要比较的数。


代码

int array[] = { 7,10,12,3,9,5 };
  for (int i = 0; i < 6; i++)
  {
    int minkey = array[i];
    for (int j = i + 1; j < 6; j++)
    {
      if (minkey < array[j])
      {
        int tamp = array[j];
        array[j] = minkey;
        minkey = tamp;
      }
    }
    array[i] = minkey;
  }

原代码有一些问题,下面是修改后的代码

int array[] = { 7,10,12,3,9,5 };
  for (int i = 0; i < 6; i++)
  {
    int minkey = i;
    for (int j = i + 1; j < 6; j++)
    {
      if (array[minkey] > array[j])
      {
      	minkey = j;
      }
    }
      int tamp = array[i];
      array[i] = array[minkey];
      array[minkey] = tamp;
  }

还是有错,再次修改。

int array[] = { 7,10,12,3,9,5 };
  for (int i = 0; i < 5; i++)
  {
    int minkey = i;
    for (int j = i + 1; j < 6; j++)
    {
      if (array[minkey] > array[j])
      {
      	minkey = j;
      }
    }
      int tamp = array[i];
      array[i] = array[minkey];
      array[minkey] = tamp;
  }