对于一串数字 【23,13,35,6,19,50,28】
i j
一次划分:找到中间的值,在中间最合适的位置,左边的数都比他小,右边的数都比他大!
if(i<j){
右侧扫描:while(i<j&&a[i]<=a[j]) j-- ;
从右边 j 的位置开始往左找,一直找到第一个比 r[i] 小的 数字,并进行交换,同时 i++。
左侧扫描:while(i<j&&a[i]<=a[j]) i++;
从左边 i 的位置开始往右寻找,一直找到第一个比 r[j] 大的 数组,并进行交换,同时 j++;
}
代码
int Partition(int r[],int first,int end){
int i=first,j=end,temp;
while(i<j){
//记住 i<j是必要的条件;
while(i<j&&r[i]<=r[j]) j--; //依旧需要i<j
//printf("此时的i和j的大小 --->>%d %d\n",i,j);
if(i<j){
temp=r[j];
r[j]=r[i];
r[i]=temp;
i++;
}
while(i<j&&r[i]<= r[j])i++;
if(i<j){
temp=r[i];
r[i]=r[j];
r[j]=temp;
j--;
}
}
return i;
}
快速排序:( 递归 )
if(first<end){
QuickSort(左边部分)
QuickSort(右边部分)
}
代码:
void QuickSort(int r[],int first,int end){
if(first<end){
int pivot=Partition(r,first,end);
// printf("%d %d\n",first,end);
QuickSort(r,first,pivot-1);
QuickSort(r,pivot+1,end);
}
}
时间性能取决于递归的深度,时间复杂度 nlog2(n);