912排序数组

81 阅读1分钟

做这题重点解决:快排、堆排序
20225/5/2复盘:无法ac
在sort函数中漏了循环终止条件
leetcode 题解第30行 if(low < high) {
如果没有的话, 1 2 3,假设pivot为1,那么永远无法终止,左区间sort(0, -1) sort(0, -1)。。。
堆排序待更新

// 快排

int partition(vector<int>& nums, int low, int high) {
    int pivot = nums[low];
    while(low < high) {
        while(nums[high] > pivot && low < high) {
            high--;
        }
        nums[low] = nums[high];
        while(nums[low] < pivot && low < high) {
            low++;
        }
        nums[high] = nums[low];
    }
    // 此时 low = high
    nums[low] = pivot;
    return low;
}
void quicksort(vector<int>& nums, int low, int high) {
    // 注意这里,递归终止条件,若没有,则一直递归调用sort(nums, 0, 0)
    if(low < high) {
        int pivotpos = partition(nums, low, high);
        quicksort(nums, low, pivotpos - 1);
        quicksort(nums, pivotpos + 1, high);
    }
}

leetcode题解为

// srand((unsigned)time(NULL))
// rand() % 10 随机生成 0~9间的数字
class Solution {
public:
    // 快排
    int partition(vector<int>& nums, int low, int high) {
        // rand() % (high - low + 1) 生成的数范围 与 low + high 区间长度相等
        // +low之后即与原来的范围相同
        int i = rand () % (high - low + 1) + low;
        swap(nums[i], nums[low]);
        int pivot = nums[low];
        while(low < high) {
            // 注意一定要使用 >= 如果只是>,数组的每个值相等情况下,low和high无法移动,一直循环
            while(nums[high] >= pivot && low < high) {
                high--;
            }
            nums[low] = nums[high];
            while(nums[low] <= pivot && low < high) {
                low++;
            }
            nums[high] = nums[low];
        }
        // 此时 low = high
        nums[low] = pivot;
        return low;
    }

    void sort(vector<int>& nums, int low, int high) {
        // 递归终止条件
        if(low < high) {
            int pivotpos = partition(nums, low, high);
            sort(nums, low, pivotpos - 1);
            sort(nums, pivotpos + 1, high); 
        }
        
    }

    vector<int> sortArray(vector<int>& nums) {
        // 随机种子
        srand((unsigned)time(NULL));
        sort(nums, 0, nums.size() - 1);
        return nums;
    }
};

堆排序