一、基本内容
快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一个部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据编程有序序列。
也就是对于一个数组 A[0] , ...... , A[N-1] ,首先任取一个数据(一般是第一个数)作为基准位,然后把所有比它小的数放到它前面,所有比它大的数放到它后面,这个过程成为一趟快排。
二、代码
#include<stdio.h>
#include<iostream>
using namespace std;
int maxn=10000;
void Qsort(int *arr,int start,int end){
if(start>=end){
return;//终止条件
}
int i=start;//每一部分的头
int j=end;//每一部分的尾
int key=arr[i];//基准位
while(i<j){//当头尾没有碰头的时候
while(i<j&&arr[j]>=key){//如果key后面的数大于key,那么j就要往前移一位再比较
j--;
}
arr[i]=arr[j];//如果arr[j]位置上的数比arr[i]小,那就给arr[j]位置上的数放到arr[i]位置
while(i<j&&arr[i]<=key){//对前半部分的操作同上
i++;
}
arr[j]=arr[i];
}
//经过while循环之后,i=j,此时要把key保存的值放到这里
arr[i]=key;//此时,key的左边是比key小的数,右边是比key大的数
//进行递归,对左右两部分分别再进行快排
Qsort(arr,start,i-1);//对左边快排
Qsort(arr,i+1,end); //对右边快排
}
int main(){
int n,arr[maxn]={0};//有n个数据
cin>>n;
for(int i=0;i<n;i++){
cin>>arr[i];
}
Qsort(arr,0,n-1);
for(int i=0;i<n;i++){
printf("%d ",arr[i]);
}
return 0;
}
三、解释说明
代码的解释在注释中已经较为详细地讲解,注意 i 和 j 可以看做首尾指针,分别指向每一段的首尾元素,在此基础上理解代码。若理解有困难可以参考下文链接视频,相信会很清晰。