快速排序 递归思想

1.快速排序的思想 

 

分治递归的思想;

 

1.实现快速排序需要知道快速排序的流程

1.选取数组中第一个位置的元素(a[low])作为 基准元素(piovt),最后一个位置的元素作为(a[high]);

2.基准元素(piovt)用来作为数组排序的基准所需要的元素,将来递归的时候,大于基准元素的放基准元素右边小于基准元素的放基准元素的左边

3.第一次递归结束后,low和high重合的位置就是当前递归基准元素(piovt)的正确位置,将基准元素(piovt)放回正确位置

4.然后将数组递归的分为两部分,第一部分为基准元素(piovt)左侧的全部数=(0,piovt),第二部分为基准元素(piovt)的右侧全部数=(piovt+1,high).

5.将数组递归完之后,所得到的数组就是排序好的数组

 

 

2.快速排序的代码实现

1.需要用两个函数分别实现1.基准元素的查找,2.数组的递归快速排序

 

1.基准元素 索引 的查找

1.定义两个变量i,j分别指向数组的第一个元素和最后一个元素

  定义 基准元素(piovt)等于数组的第一个元素

2.在传进来的数组有效的前提下

while (i < j) 

(1)将小于基准元素的 值 放基准元素左边,如果j当前指向的元素小于piovt,则向左走一步,遍历下一个元素

while (i < j && nums[j] >= piovt) {
	//如果遇到的元素>=piovt则j--向左移动 找下一个值
	j--;
}
nums[i] = nums[j];

 

  (2)  如果j当前所指向的元素小于当前基准元素(piovt),则将当前元素nums[j]变量i所指向的位置nums[i]交换

nums[i] = nums[j];

 

(3)大于基准元素的 值 放基准元素右边      (上述同理)

	//基准元素左侧值大于基准元素 将其放到基准元素的左边
	while (i<j && nums[i]<piovt) {
		i++;
	}
	nums[j] = nums[i];
}

(4)最后,将基准元素放到正确位置

// 将基准元素放到最终位置
nums[i] = piovt;
//返回最终基准元素所在的位置
return i;

最终寻找基准元素索引的函数如下:

//寻找基准元素的索引
int part(vector<int>& nums, int low, int high) {
	int i = low, j = high;
	//基准元素
	int piovt = nums[low];
	while (i < j) {
		//基准元素右侧值小于等于基准元素 将其放到基准元素的左边
		while (i < j && nums[j] >= piovt) {
			//如果遇到的元素>=piovt则j--向左移动 找下一个值
			j--;
		}
		nums[i] = nums[j];

		//基准元素左侧值大于基准元素 将其放到基准元素的左边
		while (i<j && nums[i]<piovt) {
			i++;
		}
		nums[j] = nums[i];
	}
	// 将基准元素放到最终位置
	nums[i] = piovt;
	//返回最终基准元素所在的位置
	return i;
}

 

2.数组的递归快速排序

1.mid为索引函数求的每次递归的 基准元素的索引

//快速排序
void Quickly(vector<int>& nums, int low, int high) {
	if (low < high) {
		int mid = part(nums, low, high);
		Quickly(nums, low, mid - 1);
		Quickly(nums, mid + 1, high);
	}
}

 

3.最终实现的快速排序代码

#include<iostream>
#include<stdexcept>
#include<vector>
using namespace std;

//快速排序
// 
//分治递归思想


//寻找基准元素
int part(vector<int>& nums, int low, int high) {
	int i = low, j = high;
	//基准元素
	int piovt = nums[low];
	while (i < j) {
		//基准元素右侧值小于等于基准元素 将其放到基准元素的左边
		while (i < j && nums[j] >= piovt) {
			//如果遇到的元素>=piovt则j--向左移动 找下一个值
			j--;
		}
		nums[i] = nums[j];

		//基准元素左侧值大于基准元素 将其放到基准元素的左边
		while (i<j && nums[i]<piovt) {
			i++;
		}
		nums[j] = nums[i];
	}
	// 将基准元素放到最终位置
	nums[i] = piovt;
	//返回最终基准元素所在的位置
	return i;
}

//快速排序
void Quickly(vector<int>& nums, int low, int high) {
	if (low < high) {
		int mid = part(nums, low, high);
		Quickly(nums, low, mid - 1);
		Quickly(nums, mid + 1, high);
	}
}
int main() {
	vector<int>nums = { 9, 7, 5, 11, 12, 2, 14, 3, 10, 6 };
	
	Quickly(nums, 0, nums.size() - 1);

	for (int i : nums) {
		cout << i << " ";
	}
}

时间复杂度上述快速排序代码的

平均时间复杂度为O(n log n),

最坏情况下的时间复杂度为O(n^2),

最佳情况下的时间复杂度为O(n log n)。

 

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值