排序算法 | 直接选择排序,算法的图解、实现、复杂度和稳定性分析

排序算法 | 直接选择排序,算法的图解、实现、复杂度和稳定性分析

直接选择排序

1、直接选择排序的原理

基本思想是:选择 + 交换

下面 以升序为例;
1、从待排序列中,寻找最小的元素,和 待排序列中的第一个元素交换位置,如果本身就是第一个元素最小,不用处理
2、从剩下的待排序序列中,重复进行上面的步骤,找到最小的,和待排序的第一个交换位置;

算法设计:使用两层循环

第一层循环,从前到后遍历每一个元素
第二层循环,在待排序的序列中便利,寻找 + 交换位置

2、图解直接选择排序

int arr[] = {
    
    3,24,5,15,26,27,2,4,19,15,48};

在这里插入图片描述

3、算法代码实现

① 使用位运算,不需要辅助空间的算法

void SelectSort(int *arr,int len) // 直接选择排序
{
    
    
	for(int i = 0;i < len-1;i++)
	{
    
    
		for(int j = i+1;j < len;j++)
		{
    
    
			if(arr[i] > arr[j])
			{
    
    
				arr[i] = arr[i] ^ arr[j];	// 位运算,不借助辅助空间 
				arr[j] = arr[i] ^ arr[j]; 
				arr[i] = arr[i] ^ arr[j];

//				int tmp = arr[i]; // 有辅助空间 
//				arr[i] = arr[j];
//				arr[j] = tmp;
			}
		}
 	}
}

② 运行结果
在这里插入图片描述

4、算法复杂度分析、稳定性分析

空间复杂度:如果交换的时候使用了辅助空间,就是O(1)

时间复杂度:O(N); 因为使用了两层遍历~

稳定性不稳定;前面说过,该算法的基本思想是:选择 + 交换,所以在交换的时候,可能就破坏了序列本身的前后关系;

猜你喜欢

转载自blog.csdn.net/qq_43473694/article/details/112806366