代码随想录--排序算法

912.排序数组

快速排序

思路:

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

注意:必须先比较nums[high] 与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;
    }
};
相关推荐
平和男人杨争争13 分钟前
山东大学计算机图形学期末复习15——CG15
人工智能·算法·计算机视觉·图形渲染
爱coding的橙子2 小时前
每日算法刷题Day11 5.20:leetcode不定长滑动窗口求最长/最大6道题,结束不定长滑动窗口求最长/最大,用时1h20min
算法·leetcode·职场和发展
WenGyyyL2 小时前
力扣热题——零数组变换 |
算法·leetcode·职场和发展·蓝桥杯
芯眼2 小时前
AMD Vivado™ 设计套件生成加密比特流和加密密钥
算法·fpga开发·集成测试·软件工程
咪嗷喵挖藕哇2 小时前
leetcode 合并区间 java
java·算法·leetcode
沐风ya2 小时前
leetcode每日一题 -- 3355. 零数组变换 I
算法·leetcode
纪伊路上盛名在2 小时前
leetcode字符串篇【公共前缀】:14-最长公共前缀
python·算法·leetcode
JK0x072 小时前
代码随想录算法训练营 Day52 图论Ⅲ 岛屿问题Ⅱ 面积 孤岛 水流 造岛
算法·深度优先·图论
Hygge-star2 小时前
【算法】定长滑动窗口5.20
java·数据结构·算法·学习方法·代码规范
好易学·数据结构2 小时前
可视化图解算法42:寻找峰值
算法