快速排序
思想
分而治之使用欧几里得算法(辗转相除法)来求解一个应用题
假设有一块地,现在用这个同样大小的正方形来铺满,求所可用的最大的正方形地砖的面积
用循环实现辗转相除法
#include<iostream>
using namespace std;
int main(){
int a=1680;
int b=640;
while(a%b!=0){
int t=a;
a=b;
b=t%b;
}
cout<<b;
return 0;
}
用递归实现辗转相除法
#include<iostream>
using namespace std;
int gcd(int a,int b){
if(b==0)
return a;
else return gcd(b,a%b);
}
int main(){
int a=1680;
int b=640;
cout<<gcd(a,b);;
return 0;
}
这两个方法放在一起是因为这个欧几里得要使用递归
快排的思想,每次给这个序列的一个元素找到其正确的位置,且这个元素的左右两边的元素区间内有序,即这个元素的左边的所有元素都小于等于这个元素,右边的所有元素都大于等于这个元素。
如图,给这个第一个元素进行排列,第一趟,就给第一个元素找到了其正确的位置,
而下一趟就是利用递归同时对8 的左边和右边进行快排。
快速排序的性能高度依赖所选的基准值
其实得根据算法每次选的枢轴,如果是随机选,就可以避免第一种有序时的最坏情况,如果不是随机选,而是每次都选每个分区的第一个元素,就会
使时间复杂度变成最坏的情况O(n^2)