快速排序

快速排序(Quick Sort):
  • 快速排序是由冒泡排序改进得到的。在待排序的n个记录中任取一个记录(通常为第一个记录)作为枢轴(或支点),设其关键字为key。经过一趟排序后,把所有关键字小于key的记录交换到前面,把所有关键字大于key的记录交换到后面,结果将待排序记录分成两个子表,最后将枢轴放在分界处的位置。然后,分别对左右子表重复上面的过程,直到每个子表只有一个记录时,排序完成。
  • 图解:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

完成一趟快速排序,然后分别对关键值左边和右边的分别进行快排

第一趟:{27 38 13} 49 {76 97 65 49}
第二趟:{13} 27 {38} 49 {76 97 65 49}
第三趟:13 27 38 49 {49 65} 76 {97}
第四趟:13 27 38 49 49 {65} 76 97

  • 代码示例:
#include<iostream>
using namespace std;

int find_key(int low, int high, int *array){
	int key=array[low];   //保存枢轴值
	while(high>low){
		while(high>low && array[high]>=key)
			--high;
		array[low] = array[high];  //比枢轴值小交换
		while(high>low && array[low]<=key)
			++low;
		array[high] = array[low];  //比枢轴值大交换
	}
	array[low] = key;   //将枢轴值插入
	return low;
}

void quick_sort(int low, int high, int *array){
	int key_position;
	if(high>low){
		key_position = find_key(low, high, array);
		quick_sort(low, key_position-1, array);
		quick_sort(key_position+1, high, array);
	}
}
int main(){
	int data[] = {49,38,65,97,76,13,27,49};
	quick_sort(0, 7, data);

	for(int i=0; i<8; i++){
		cout<<data[i]<<" ";
	}
	return 0;
}


Output:13 27 38 49 49 65 76 97
  • 时间复杂度O(n*log2(n)):

1.算法从两头交替搜索,直到low与high重合,时间复杂度为O(n)
2.假设每次划分几乎将序列等分,设需要的划分次数为k,有:
2^k = n
则k=log2(n)
所以时间复杂度为O(n*log2(n))

  • 空间复杂度( O(log2(n)-O(n) ):

每次递归需要一个数组存储数据,最好情况下,每次递归都将元素分割为两个长度相近的子表,此时数组最大的长度为log2(n),即递归树的深度,空间复杂度为O(log2(n))。最坏情况下,长度为n,空间复杂度为O(n)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值