【算法集训】基础算法:基础排序 - 选择排序

从上一学期期末考完之后就鸽了,真的惭愧,还想着期末考完就开始呢,结果考驾照完了后又有学校项目要忙活。终于是拖到开学了哈哈,虽然现在事情也比较多,但是总归是要开始的,不然马上就要拖延症晚期了!!!

加油加油,冲冲冲。看看能不能冲一下CCF

推荐一个算法动画网站:https://visualgo.net/zh/sorting

一、基本理解

选择排序就是每一轮都选择最小 | 最大 的值放到最前面,等到遍历完毕即可完成排序

大致算法步骤:

  1. 两层循环: 第一层 定义每轮最初的假定最小 | 最大值; 第二层则是进行比较找出最小值
  2. 每一次内循环完毕后需要将当前找到的最小值移动到前面。
  3. 如此往复,可排序成功

二、题目练习

75. 颜色分类

没什么好说的,基本思路,都能看懂。

c 复制代码
void sortColors(int* nums, int numsSize) {
    int n = numsSize;
    for(int i = 0; i < n - 1; ++i) {
        int minIdx = i;  //最初假定最小值点为i
        for(int j = i + 1; j < n; ++j) {
            //判断是否小于"最小值""
            if(nums[j] < nums[minIdx]) {
                minIdx = j;
            }
        }
        // 交换
        int temp = nums[i];
        nums[i] = nums[minIdx];
        nums[minIdx] = temp;
    }
}

4. 寻找两个正序数组的中位数

c 复制代码
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
    int n = nums1Size + nums2Size;
    int * arr = (int *)malloc(sizeof(int) * n);
    // 两个数组整合到一个数组
    for(int i = 0; i < nums1Size; ++i) {
        arr[i] = nums1[i];
    }
    for(int i = 0; i < nums2Size; ++i) {
        arr[i + nums1Size] = nums2[i];
    }

    // 排序数组
    for(int i = 0; i < n - 1; ++i) {
        int minIdx = i;
        for(int j = i + 1; j < n; ++j) {
            if(arr[j] < arr[minIdx]) {
                minIdx = j;
            }
        }
        int temp = arr[i];
        arr[i] = arr[minIdx];
        arr[minIdx] = temp;
    }
    // 中位数
    if(n % 2) {
        return arr[n / 2];
    }else {
        return (arr[n / 2] + arr[n / 2 - 1]) / 2.0;
    }
}

747. 至少是其他数字两倍的最大数

c 复制代码
int dominantIndex(int* nums, int numsSize) {
    int n = numsSize;
    int i = 0;
    int maxIdx = i;
    // 只内循环一次就可以,取消外循环
    for(int j = i + 1; j < n; ++j) {
        if(nums[j] > nums[maxIdx]) {
            maxIdx = j;
        }
    }
    // 判断是否是数组中每个其他数字的两倍
    for(int i = 0; i < n; ++i) {
        if(i == maxIdx) continue;
        if(nums[i] * 2 > nums[maxIdx]) {
            return -1;
        }
    }
    return maxIdx;
}

1502. 判断能否形成等差数列

c 复制代码
bool canMakeArithmeticProgression(int* arr, int arrSize) {
    int n = arrSize;
    for(int i = 0; i < n - 1; ++i) {
        int minIdx = i;
        for(int j = i + 1; j < n; ++j) {
            if(arr[j] < arr[minIdx]) {
                minIdx = j;
            }
        }
        int tmp = arr[i];
        arr[i] = arr[minIdx];
        arr[minIdx] = tmp;
    }

    for(int i = 0; i < n - 2; ++i) {
        if(arr[i + 1] - arr[i] !=  arr[i + 2] - arr[i + 1]) {
            return false;
        }
    }
    return true;
}
相关推荐
代码雕刻家20 分钟前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
雨中rain20 分钟前
算法 | 位运算(哈希思想)
算法
Kalika0-02 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
sp_fyf_20242 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
我是哈哈hh4 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝
Tisfy4 小时前
LeetCode 2187.完成旅途的最少时间:二分查找
算法·leetcode·二分查找·题解·二分
Mephisto.java4 小时前
【力扣 | SQL题 | 每日四题】力扣2082, 2084, 2072, 2112, 180
sql·算法·leetcode
robin_suli4 小时前
滑动窗口->dd爱框框
算法
丶Darling.4 小时前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
labuladuo5205 小时前
Codeforces Round 977 (Div. 2) C2 Adjust The Presentation (Hard Version)(思维,set)
数据结构·c++·算法