假设针对int arr[]在[l, h)区间升序排序
步骤1、取arr[l],将其移动到位置m,使m的左边都小于arr[l],右边都大于arr[l]
步骤2、[l, m)、[m+1, h)区间重复步骤1
可见,这是一个递归过程,代码如下:
int arr[] = {8,1,3,6,9,0,4,7,5,2};
int len = sizeof(arr)/sizeof(arr[0]);
int find(int l, int h)
{
if(l >= h ) return -1;
int m = l, falg = 0, key = arr[l], t = 0;
for(int i = l; i < h; i++)
{
if( flag == 0)
{
if( arr[i] < key)
++m;
else
flag = 1; //表示接下来 arr[i] < key的要交换了
}
else
{
if( arr[i] < key)
{
++m;
t = arr[i]; arr[i] = arr[m]; arr[m] = t;
}
}
}
arr[l] = arr[m]; arr[m] = key;
find(l, m);
find(m+1, h);
}
注意点:针对每个元素都是先确定其位置,最后交换,不要在循环中频繁交换。
阅读(1488) | 评论(0) | 转发(0) |