快速排序&&堆排序

本文探讨了两种高效的排序算法:quicksort通过分区和递归实现的快速排序,以及heapSort利用大顶堆结构进行的堆排序。讲解了partition函数的工作原理和quicksort的递归过程,以及大顶堆的初始化和排序过程。展示了在C++中的实现实例。
摘要由CSDN通过智能技术生成
class solution {
private:
	int partition(vector<int>& nums, int low, int high) {
		int i = low;
		int j = high + 1;
		int p = nums[low];
		while (1) {
			while (nums[++i] < p) {//找到一个大于p的值
				if (i == high)break;//跳出当前循环
			}
			while (nums[--j] > p) {
				if (j == low)break;//跳出当前循环
			}
			if (i >= j)break;//当i>=j时,说明j遍历到了该和p交换的位置,此时跳出大循环
			swap(nums[i], nums[j]);
		}
		swap(nums[low], nums[j]);
		return j;
	}
	void quicksort(vector<int>& nums, int low, int high) {
		if (low >= high)return;
		int j = partition(nums, low, high);
		quicksort(nums, low, j - 1);
		quicksort(nums, j + 1, high);
	}
public:
	vector<int>sort(vector<int>nums) {
		int low = 0;
		int high = nums.size() - 1;
		quicksort(nums, low, high);
		return nums;
	}
};
int main() {
	solution s1;
	vector<int> nums = { 40,10,65,20,90,30,25,80,70,60 };
	vector<int>result = s1.sort(nums);
	for (auto i : result) {
		cout << i << " ";
	}		 
}

说明:partition()函数的作用就是将当前数组的第一个元素(分割值)放到它该在的位置上;
quicksort()函数做递归操作,递归的终止条件就是low>=high

#include <iostream>
#include <vector>
using namespace std;
class solution {
private:
    void maxheapInit(vector<int>& nums, int root, int len) {
        int left = 2 * root + 1;
        int right = 2 * root + 2;
        int max = root;
        if (left<len && nums[left]>nums[max])max = left;
        if (right<len && nums[right]>nums[max])max = right;
        if (max != root) {
            swap(nums[root], nums[max]);
            maxheapInit(nums, max, len);
        }
    }
public:
    vector<int> heapSort(vector<int>nums) {
        int len = nums.size();
        for (int i = len / 2 - 1; i >= 0; i--) {
            maxheapInit(nums, i, len);
        }
        cout << "初始化大顶堆:" << endl;
        for (int i : nums)
            cout << i << ' ';
        cout << endl;
        for (int i = len - 1; i >= 0; i--) {
            swap(nums[i], nums[0]);
            maxheapInit(nums, 0, i);//注意这里是i,到达相应位置上的元素就不再动他了
        }
        return nums;
    }
};
int main() {
    vector<int> nums = { 2,6,3,1,7,4,9,5,8,10};
    solution s;
    vector<int>result = s.heapSort(nums);
    cout << "排序重建堆:" << endl;

    for (int i :result)
        cout <<i << ' ';
    cout << endl;

    return 0;
}

说明:
1、第一步初始化大顶堆,由heapSort函数中第一个for循环完成,此时该堆结构的所有节点都大于其左右子节点的值(如果子节点存在的话),然后就开始利用大顶堆这个数据结构完成排序
2、排序就是将每个元素放到它该在的位置上,将堆顶元素和堆的最后一个元素交换,这样最大的元素就到了它应该在的位置上了,但是将打乱大顶堆结构的那个元素(堆顶元素)下沉,使得保持大顶堆的数据结构(这样次大的元素就到了堆顶位置…)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值