算法学习第二记-选择排序

  这篇文章我们来讲讲选择排序这种排序算法的原理及其效率分析,首先选择排序的实现思路是将待排序序列分为两段,一段为已排序区间,另一段为未排序区间。所以排序的操作是每次从未排序区间的最左边那个元素开始,向右查找最小元素,找到后与当前元素进行交换,同时已排序区间的元素就多了一个了,下面给上示意图:

下面给出选择排序的代码:

void Select_Sort(int arr[],int length)
{
   for(int i=0;i<length;i++)
  {
     int min=i;
     for(int j=i+1;j<length;j++)
       if(arr[j]<arr[min])
         min=j;
    if(min!=i)
     swap(arr[i],arr[min]);
  }
}

 下面我们来分析下选择排序的效率:

  首先选择排序没有利用到额外的空间,所以它的空间复杂度是O(1),属于原地排序算法。选择排序最好最坏平均都为O(n²),简单来看的话外层循环执行n次,每一次的内层循环分别执行n-1,n-2,n-3........,很容易看出来是一个等差数列,等差数列前n项和为n*(n-1)/2,所以它的时间复杂度为O(n²)。

  那么选择排序是一种稳定排序算法么?恐怕不是。从前面一张图可以看出,选择排序每次都要找剩余未排序元素中的最小值,并和前面的元素交换位置,这样破坏了稳定性。

比如 5,8,5,2,9这样一组数据,使用选择排序算法来排序的话,第一次找到最小元素2,与第一个5和中间的5顺序就变了,所以就不稳定了。

猜你喜欢

转载自blog.csdn.net/qq_31984717/article/details/83927574