排序算法 | 直接选择排序,算法的图解、实现、复杂度和稳定性分析
直接选择排序
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); 因为使用了两层遍历~
③ 稳定性:不稳定;前面说过,该算法的基本思想是:选择 + 交换,所以在交换的时候,可能就破坏了序列本身的前后关系;