代码随想录--排序算法

912.排序数组

快速排序

思路:

复制代码
		1.  设置一个pivot
		2. 将小于nums[pivot]的值 放在左边
		3. 将 大于nums[pivot]的值  放在 右边
		4. 递归调用

注意:必须先比较numshigh 与pivot

代码:

cpp 复制代码
class Solution {

    int partition(vector<int>&nums, int low, int high){
        int pivot = nums[low];
        while(low<high){
            while(low <high && nums[high]>=pivot){
                high--;
            }nums[low] = nums[high];

            while(low<high && nums[low]<=pivot){
                low++;
            }nums[high] = nums[low];

        }
        nums[low] = pivot;
        return low;
    }

    void quiksort(vector<int>&nums, int low, int high){
        if(low<high){
            int pos = partition(nums, low, high);
            quiksort(nums, low, pos-1);
            quiksort(nums, pos+1, high);
        }
    }

public:
    vector<int> sortArray(vector<int>& nums) {
        quiksort(nums, 0, (int)nums.size()-1);
        return nums;
    }
};

堆排序

思路:

复制代码
1.构造大顶堆   
2. 取出堆顶元素
3. 构造大顶堆
4. 取出堆顶元素	

将堆顶元素放入末尾,下次构造大顶堆时不考虑

注意:

代码:

cpp 复制代码
class Solution {
    void buildMaxHeap(vector<int>& nums) {
        int n = nums.size();
        for (int i = (n - 1) / 2; i >= 0; --i) {
            maxHeapify(nums, i, n);
        }
    }

    void maxHeapify(vector<int>& nums, int i, int n) {
        while (i * 2 + 1 < n) {
            // 代表当前 i 节点的左右儿子;
            // 超出数组大小则代表当前 i 节点为叶子节点,不需要移位
            int lSon = 2 * i + 1;
            int rSon = 2 * i + 2;
            int large = i;
            if (lSon < n && nums[lSon] > nums[i]) large = lSon;
            if (rSon < n && nums[rSon] > nums[large]) large = rSon;

            if (large != i) {
                swap(nums[i], nums[large]);
                // 迭代判断对应子节点及其儿子节点的大小关系
                i = large;
            } else {
                break;
            }
        }
    }

public:
    vector<int> sortArray(vector<int>& nums) {
        // heapSort 堆排序
        int n = nums.size();
        // 将数组整理成大根堆
        buildMaxHeap(nums);
        for (int i = n - 1; i >= 1; --i) {
            // 依次弹出最大元素,放到数组最后,当前排序对应数组大小 - 1
            swap(nums[0], nums[i]);
            --n;
            maxHeapify(nums, 0, n);
        }
        return nums;
    }
};

归并排序

思路: 将有序序列 合并成一个

注意:

代码:

cpp 复制代码
class Solution {
    vector<int> tmp;
    void mergeSort(vector<int>& nums, int l, int r) {
        if (l >= r) return;
        int mid = (l + r) >> 1;
        mergeSort(nums, l, mid);
        mergeSort(nums, mid + 1, r);
        int i = l, j = mid + 1;
        int cnt = 0;
        while (i <= mid && j <= r) {
            if (nums[i] <= nums[j]) {
                tmp[cnt++] = nums[i++];
            }
            else {
                tmp[cnt++] = nums[j++];
            }
        }
        while (i <= mid) {
            tmp[cnt++] = nums[i++];
        }
        while (j <= r) {
            tmp[cnt++] = nums[j++];
        }
        for (int i = 0; i < r - l + 1; ++i) {
            nums[i + l] = tmp[i];
        }
    }
public:
    vector<int> sortArray(vector<int>& nums) {
        tmp.resize((int)nums.size(), 0);
        mergeSort(nums, 0, (int)nums.size() - 1);
        return nums;
    }
};
相关推荐
kkeeper~8 小时前
0基础C语言积跬步之数据在内存中的存储
c语言·数据结构·算法
2401_868534788 小时前
论企业网络设计
数据结构
wabs6669 小时前
关于贪心算法的一些自我总结【力扣45.跳跃游戏II】【灵感来源:代码随想录】
算法·贪心算法·复盘
2401_876964139 小时前
【湖北专升本】2026湖北专升本真题PDF+备考资料汇总
数据结构·人工智能·经验分享·深度学习·算法·计算机视觉
嗝o゚10 小时前
CANN GE 算子融合——融合算法与调度策略
算法·昇腾·cann·ge
小江的记录本10 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
Ulyanov11 小时前
用声明式语法重新定义Python桌面UI:QML+PySide6现代开发入门(一)
开发语言·python·算法·ui·系统仿真·雷达电子对抗仿真
数据科学小丫11 小时前
特征工程处理
人工智能·算法·机器学习
z落落12 小时前
C#参数区别
java·算法·c#
c2385613 小时前
vector(下)
数据结构·算法