#include<stdio.h>
#define max 10
void print(int a[],int n); //打印
int Partition(int a[],int low,int high); //划分
int QuickSort(int a[],int low,int high); //利用迭代划分的快排
void print(int a[],int n) {
for(int i=0;i < n;i++)
printf("%d ",a[i]);
printf("\n");
}
//交换排序-快速排序
int Partition(int a[],int low,int high){
int pivot = a[low];
while(low < high){ //思考一下:两个while子循环位置能交换吗? 不能,因为pivot开始存的的a[low]的值,最后可以把a[low]的值复现,如果交换顺序a[high]的值被覆盖就不能还原了
printf("low=%d \t high=%d\n",low,high);
while(low<high && a[high]>=pivot) --high;
a[low] = a[high]; //此时不符合while判断条件,说明a[high] < pivot所以把a[high]放左边
while(low<high && a[low]<=pivot) ++low;
a[high] = a[low]; //此时不符合while判断条件,说明a[low] > pivot所以把a[low]放右边
}
a[low] = pivot; //第一趟排序结束,low=high的位置赋值最初的a[low],比他大的在它右遍,比他小的在他左边
return low; //返回最终确定的pivot的切分位置,这个位置左边比他小,右遍比他大。
}
int QuickSort(int a[],int low,int high){
if(low < high){ //递归的跳出条件
int pivotpos = Partition(a,low,high); //找到最初的切分点
QuickSort(a,low,pivotpos-1); //切分点左边排序
QuickSort(a,pivotpos+1,high); //切分点右边排序 注意要加1 因为pivotpos的位置就是最终位置不需要再参与后续排序了
}
}
int main(){
int a[10] = {2,1,4,3,7,9,8,5,6,10};
printf("排序前: ");
print(a,max);
QuickSort(a,0,9);
printf("排序后: ");
print(a,max);
}
快速排序 快速理解
最新推荐文章于 2023-07-14 00:19:57 发布