标题
前言
排序算法虽然简单,但是我也要掌握熟练应用,因为学习算法这个复杂的过程,我们应该由浅到深,由简单到复杂,并且该算法在acm,蓝桥杯等算法竞赛中可能会用到。让我们来深入了解该算法。
一、什么是选择排序
选择排序是一种简单的排序算法,**它的基本思想是每次从未排序的部分中选择最小的元素,与未排序部分的第一个元素交换位置。**这样,每次选择后,已排序的部分就增加一个元素,未排序的部分就减少一个元素,直到整个数组都排序完成。选择排序的时间复杂度是O(n^2),空间复杂度是O(1)。
二、算法图解
三、经典例题
1、颜色分类
(帅哥们这个蓝色字体可以点进去看原题)
题解思路
从i=0定义一个元素最小值的下标为min,然后再从i+1遍历数组找到比min下标元素值小的元素,将min赋值为j,然后在和下标为i的元素的值进行交换。
代码题解
class Solution {
public:
void sortColors(vector<int>& nums) {
for(int i=0;i<nums.size();i++){
int min=i;
for(int j=i+1;j<nums.size();j++){
if(nums[j]<nums[min]){
min=j;
}
}
int t=nums[i];
nums[i]=nums[min];
nums[min]=t;
}
}
};
2、至少是其他数字两倍的最大数
(帅哥们这个蓝色字体可以点进去看原题)
解题思路
将元素组最大值的下标找出来,赋值给max,然后用选择排序排序数组,再用排完序数组倒数第二个值(也就是第二大的值)与最大值比较。
代码题解
class Solution {
public:
int dominantIndex(vector<int>& nums) {
int max=0;
for(int i=1;i<nums.size();i++){
if(nums[i]>nums[max])max=i;//先找最大值的下标
}
for(int i=0;i<nums.size();i++){//排序数组
int min=i;
for(int j=i+1;j<nums.size();j++){
if(nums[j]<nums[min])min=j;
}
int t=nums[min];
nums[min]=nums[i];
nums[i]=t;
}
int n=nums.size();
if(nums[n-1]>=2*nums[n-2])return max;//如果最大值是第二大值的两倍返回最大下标
return -1;
}
};
3、寻找两个正序数组的中位数
(帅哥们这个蓝色字体可以点进去看原题)
解题思路
把num2的元素通通插入num1中,这时候在进行选择排序,如果元素个数为奇数就返回数组长度除以二的值,反之为偶数,就返回中间两个数的和除以2。
代码题解
class Solution {
void selectionSort(vector<int>&a){
for(int i=0;i<a.size();i++){
int min=i;
for(int j=i+1;j<a.size();j++){
if(a[j]<a[min])min=j;
}
int t=a[i];
a[i]=a[min];
a[min]=t;
}
}
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
for(int i=0;i<nums2.size();i++){
int x=nums2[i];
nums1.push_back(x);
}
selectionSort(nums1);
int n=nums1.size();
if(n&1)return nums1[n/2];//如果是奇数个元素返回数组下标为n/2的值
return (nums1[n/2-1]+nums1[n/2])*1.0/2;//反之为偶数就返回中间那两个数之和除以2
}
};
#四 总结
相信学到这里那你已经对选择排序有更深的理解,如果还不明白,那就说明需要多练,菜就多练,关注我,以后持续更新更多算法作品,和我一起学习,听到了没。
希望各位帅哥可以点赞加关注支持一下,非常感谢!!!