快排是一种基于交换的排序,冒泡排序(两两相邻作比较,逆序则交换)也是基于交换的排序,快排运用了二分法的思想,每次找一个哨兵,比哨兵小的放一边,大的放一边,这是完成了一趟快排。
冒泡代码:
for(int i=0;i<n;i++){
for(int j=0;j<n-i;j++){//n-i-1比n-i更合适
if(a[j]>a[j+1]){
int t=a[j];a[j]=a[j+1];a[j+1]=t;
}
}
快排一代码:
void quicksort(int left,int right){
if(left>=right)return ;
int t=a[left];//哨兵
int i=left,j=right;
while(i!=j){
while(a[j]>=t&&i<j)
j--;
while(a[i]<=t&&i<j)
i++;
if(i<j){
int k=a[i];a[i]=a[j];a[j]=k;
}
}
a[left]=a[i];
a[i]=t;
quicksort(left,i-1);
quicksort(i+1,right);
}
快排二代码:
void quicksort(int left,int right){
if(left>=right)return ;
int t=a[left];//哨兵
int i=left,j=right;
while(i!=j){
while(a[j]>=t&&i<j)
j--;
{
a[i]=a[j];
}
while(a[i]<=t&&i<j)
i++;
{
a[j]=a[i];
}
}
a[i]=t;
quicksort(left,i-1);
quicksort(i+1,right);
}
区别:
都必须先从右往左找逆序。
排序一是找到两个逆序做交换;
排序一是令原哨兵的位置为空,交替覆盖;