先贴在分析
void swap(int *x,int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
int choose_pivot(int i,int j )
{
return((i+j) /2);
}
void quicksort(int list[],int m,int n)
{
int key,i,j,k;
if( m < n)
{
k = choose_pivot(m,n);
swap(&list[m],&list[k]);// 把区分用的值放置在大小数组的中间
key = list[m];// key是下面划分数组的标准
i = m+1;// list[m] 已经确定为分组标准不进行判断
j = n;
while(i <= j)
{
while((i <= n) && (list[i] <= key))
i++;
while((j >= m) && (list[j] > key))
j--;
if( i < j)
swap(&list[i],&list[j]);
}
// 假设数组在递归到最后变成二元组 这一步负责交换二元组
swap(&list[m],&list[j]);
// 递归地对较小的数据序列进行排序
quicksort(list,m,j-1);// 将一个完整的数组分成2个小的 然后递归 直至分成一个2元组
quicksort(list,j+1,n);
}
}
上动态图
看懂图题目解决大半
下面开始分析
1.我们先选择数组最中间的那一项, 默认他为数组的大小区分分界线,
2,然后将数组后部大于分界线的移动到前半部分(这里可能有疑问后面说明)
3.然后项的排序就变成了 前x项和后(n - x)项的排序
重复1 . 2. 3步 直至对2个数字进行排序
疑问解释 :
quickrock函数开头部分交换list[m]和list[k]的意义是为了为下面的递归服务
后面的递归交换m和k是因为 k所代表的是分段之后小数组的最大值为了下次筛选我们将他与任意一个值进行交换(这里默认是M因为m一定在小数组内)当然这步也解决了如果数组中间项是数组最大值的问题。
最后所有的分组都完成之后递归向前回溯 从二元组开始一个个排序 然后3元组, 四元组 直至N元 排序完成。