一.什么是快速排序
快速排序需要再数组中找到一个“基准”(pivot),然后将小于基准的元素按原相对位置放在基准值的左边,大于基准的元素按原相对位置放在基准的右边。依此类推,每一块区域再重复该操作,直到排好顺序。
选择基准值的方法有很多,可以选择第一个元素,也可以根据自己的需求选择相应位置的元素。我们的做法选择的是位于数组最中间的元素做为基准值。
注意:
图片源自:
https://commons.wikimedia.org/w/index.php?curid=1965827
我们下面使用了完整的C++、python代码加注释进行展示。
二.C++代码
#include<iostream>
using namespace std;
/*
快速排序:通过不断的切分来实现排序(不同于归并排序有规律的切分)
*/
//比较函数,小的数放在前面,改变<号为>号,则从大到小排序
template<typename E>
bool compare(E a,E b)
{
return a<b;
}
//交换函数,a和b位置的元素互换
template<typename E>
void swap(E A[],int a,int b)
{
int temp=A[a];
A[a]=A[b];
A[b]=temp;
}
//打印输出函数
template<typename E>
void print(E A[],int n)
{
for(int i=0;i<n;i++)
{
if(i==n-1) cout<<A[i]<<endl;
else cout<<A[i]<<" ";
}
}
//找到基准值的位置并返回
template<typename E>
inline int findpivot(E A[],int i,int j)
{
return (i+j)/2;
}
//以该基准值进行一轮快排,并返回基准值应该放置的位置
template<typename E>
inline int partition(E A[],int l,int r,E& pivot)
{
do
{
/*
从两端找到不符合条件的两个数并进行交换
从前往后找到比基准值大的数,从后往前找到比基准值小的数
交换它们两,使得小的数再左边,大的再右边
*/
while(compare(A[++l],pivot));
while((l<r) && (compare(pivot,A[--r])));
swap(A,l,r);
}while(l<r);
return l;
}
//快速排序函数
template<typename E>
void qsort(E A[],int i,int j) //A为原数组,i为A初始位置下标,j为A末尾位置下标
{
if(j<=i) return ;
int pivotindex=findpivot(A,i,j); //查找轴值(基准值),并返回其下标
swap(A,pivotindex,j); //将轴值换到数组末尾
int k=partition<E>(A,i-1,j,A[j]); //通过一轮快排返回轴值合适的位置下标
swap(A,k,j); //将基准值放到合适的位置
//基准值的左右两边再分别进行快排
qsort<E>(A,i,k-1);
qsort<E>(A,k+1,j);
}
int main()
{
int a[10]={2,4,3,6,9,0,1,6,4,5};
cout<<"begin:";
print(a,10);
qsort(a,0,9);
cout<<"end:";
print(a,10);
system("pause");
return 0;
}
三.python代码
与C++代码类似
def qsort(A,i,j):
if j<=i:
return ;
pivot = findpivot(i,j)
swap(A,pivot,j)
k = partition(A,i,j-1,A[j])
swap(A,k,j)
qsort(A,i,k-1)
qsort(A,k+1,j)
def partition(A,l,r,pivot):
while 1:
while compare(A[l],pivot):
l+=1
while compare(pivot,A[r]) and l<r:
r-=1
swap(A,l,r)
if r<=l:
break
return l
def findpivot(l,r):
return (l+r)//2
def compare(i,j):
return i<j
def swap(A,i,j):
m = A[i]
A[i] = A[j]
A[j] = m
def printA(A):
for i in A:
print(i,' ',end='')
def main():
A = [4,3,5,6,1,2,0,8,7,9]
print('begin:',end='')
printA(A)
qsort(A,0,9)
print('\n end:',end='')
printA(A)
main()