排序 —— 简单选择排序

一、算法思想

选择表L的最大(小)元素,与最后位置上元素交换。其步骤如下:

  1. 对于表 L=(a1,az,a3,.…,ai.…,an),顺序遍历,选择出最大元素所在位置,与最后位置元素交换;
  2. 对于除最后一个元素之外的剩余部分构成的子表重复(1),直到剩余部分构成的子表表长等于1为止。

二、算法过程

在这里插入图片描述


三、实现

void SelectSort(int R[],int n)
{
	int i,j;
	int temp;
	int max_index;
	for(i=0;i<n;i++)
	{
		max_index=-1;
		for(j=0;j<n-i;j++)
		{
			if(R[j]>max_index)
				max_index=j;
		}
		if(max_index>=0)
		{
			j--;
			temp=R[max_index];
			R[max_index]=R[j];
			R[j]=temp;
		}
	}
}

四、算法性能分析

(1)时间复杂度分析

两层循环的执行次数和初始序列没有关系,外层循环执行 n 次,内层循环执行 n-1 次,将最内层循环中的比较操作视为关键操作,其执行次数为 n(n-1)/2,故其平均时间复杂度、最坏时间复杂度、最好时间复杂度均为 O(n^2)

(2)空间复杂度分析

空间复杂度为 O(1)

(3)稳定性

从语句 if ( R[ j ] > max_index ) 中可以看到,算法总是将首次遇到的最大的值加入到已排序的序列中(如果遇到相同的值则会跳过),此时算法是不稳定的。(若将 > 改成 >= ,则算法稳定,但这样会增加 max_index = j 的执行次数)

猜你喜欢

转载自blog.csdn.net/starter_____/article/details/93977495
今日推荐