九日集训第五天(排序api)

前言

记录几个面试常见题型

一、知识点

C语言中sort api 的使用 ,compare
一道排序题目,数据范围是关键,如果这道题目只能让我们使用O(nlogn)O(nlogn)的算法,显然我们可以选择快速排序,归并排序等算法,这里我们就使用快速排序.

时间复杂度图
在这里插入图片描述

二、题目

1、排序数组

1.1 分析
可以直接用 stl sort
这里封装了一个快排函数,顺便复习下排序算法

1.2代码

class Solution {
public:
   vector<int> sortArray(vector<int>& nums) {
       srand((unsigned)time(NULL));
       quick_sort(nums,0 , (int) nums.size() - 1);

       return nums;
       

    }
    void quick_sort(vector<int>& q, int l, int r)
{
    if (l >= r) return;

    int i = l - 1, j = r + 1, x = q[l + r >> 1];
    while (i < j)
    {
        do i ++ ; while (q[i] < x);
        do j -- ; while (q[j] > x);
        if (i < j) swap(q[i], q[j]);
    }

    quick_sort(q, l, j);
    quick_sort(q, j + 1, r);
}


};

2、多数元素
2.1题目分析
简单题,读懂题目就行
2.2代码


class Solution {
public:
    int majorityElement(vector<int>& nums) {

        sort(nums.begin(),nums.end());

        return nums[nums.size()/2];

    }
};

3存在重复元素
3.1题目分析
专栏给的遍历法,自己使用了 map 方便
3.2代码

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {

        unordered_map<int,int> m;

        for(int i = 0 ; i < nums.size(); i ++)
            if(m.count(nums[i]))
                return true;

            else m[nums[i]] ++;

        return false;
    }
};

4最大间距
4.1题目分析
恢复有序,在遍历找答案
4.2代码

class Solution {
public:
    int maximumGap(vector<int>& nums) {

        int n = nums.size() , max  = 0 , tem = 0;

        if(n < 2) return 0;
        sort(nums.begin() , nums.end());
        for(int i = 1 ; i < n ; i ++)
        {   
            tem = nums[i] - nums[i - 1];
            if(tem> max)
                max = tem;
        }

        return max;

    }
};

5按奇偶排序数组
5.1题目分析
用双端列表 ,前后添加
5.2代码

class Solution {
public:
    vector<int> sortArrayByParity(vector<int>& nums) {

        deque<int> ans;

        int n = nums.size();

        for(int i = 0 ;  i < n ; i ++)
        {
            if(nums[i]%2)
                ans.push_back(nums[i]);
            else
                ans.push_front(nums[i]);
        }

        return vector<int>(d.begin(),d.end());

    }
    
};

三、做题记录

在这里插入图片描述







### 单线程归并排序算法实现 #### 归并排序简介 归并排序是一种基于分治法的比较型排序算法。该算法通过递归地将列表分成两半,分别对每一部分进行排序,再将两个有序的部分合并成一个完整的有序序列。 #### 算法描述 为了理解单线程下的归并排序过程,以下是具体的步骤说明: - 将待排序列分为尽可能相等的子序列; - 对各子序列独立应用相同的排序方法; - 合并已排序好的子序列得到最终的结果; 此过程中涉及的关键操作包括分割数组以及后续的合并工作[^1]。 #### Python代码实例 下面给出了一种使用Python编写的简单版本的单线程归并排序函数: ```python def merge_sort(arr): if len(arr) > 1: mid = len(arr) // 2 # 找到中间位置 L = arr[:mid] # 左侧子数组 R = arr[mid:] # 右侧子数组 merge_sort(L) # 排序左侧子数组 merge_sort(R) # 排序右侧子数组 i = j = k = 0 while i < len(L) and j < len(R): # 合并数据 if L[i] < R[j]: arr[k] = L[i] i += 1 else: arr[k] = R[j] j += 1 k += 1 while i < len(L): # 检查是否有剩余项 arr[k] = L[i] i += 1 k += 1 while j < len(R): # 检查是否有剩余项 arr[k] = R[j] j += 1 k += 1 arr_example = [12, 11, 13, 5, 6, 7] print("原始数组:", arr_example) merge_sort(arr_example) print("排序后的数组:", arr_example) ``` 这段代码展示了如何在一个简单的场景中运用归并排序来整理一组整数。它首先定义了一个`merge_sort()` 函数用于执行实际的排序逻辑,并且提供了测试用的数据集来进行验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值