快速排序思想:每次确定一个结点的最终位置,然后再将数组按这个结点位置左右划分为两个区间依次继续确定新结点位置。
平均时间复杂度,但当原数组基本有序的情况下复杂度达到
int partition(int a[], int low, int high){
int pivot=a[low];
//low=high就是两个指针同时指向一个空结点
while(low<high){
//移动是high和low交叉移动,两个while循环分布代表两个指针移动,保证非空指针移动
while(high>low && a[high]>=pivotpos)high--;
a[low]=a[high];
while(high>low && a[low]<=pivotpos)low++;
a[high]=a[low];
}
//最后low=high=pivot
a[low]=pivot;
return low;
}
void QuicSort(int a[], int low, int high) {
//low=high代表只有一个点,不需要排序了
if(low<high){
//先找到中心枢纽点的位置,再根据这个位置左右继续划分排序;
int pivotpos=partition(a, low, high);
QuicSort(a, low, pivotpos-1);
QuicSort(a, pivotpos+1, high);
}
}