快速排序
思维卡点
数组中与对照值相等的值,无论放对照值的左边或者右边都是没问题的
数组中与对照值相等的值,刚开始存放的位置很迷惑;这个问题想通了,代码实现就清晰了.
细节注意点
- 对照值选取;(本文标记为p)
- 对照值在数组中的位置维护;(本文标记为p_inx)
- 满足循环的条件双遍历下标s,e需要满足s<=e;(本文中s的初始化为数组的起始下标,e为数组的结束下标)
- 循环体首要先判断是否s==e;(满足处理数组长度只有2个的场景)
- nums[p]>=nums[s]的情况都需要移动s,进行s++;
- nums[p]<=nums[e]的情况都需要移动e,进行e–;
- 处理s==e的情景时,如果nums[p]>nums[e],直接交换并且返回e;
- 如果nums[p]<=nums[e],交换e-1与p的值,返回e-1;
- 然后再分治;
C代码
int get_final_index(void **list, int s, int e, compare comp);
void swap(void **list, int a, int b);
void quick_sort(void **list, int start, int end, compare comp);
typedef int (*compare)(void *,void *);
int get_final_index(void **list, int s, int e, compare comp)
{
int fi;
int p_inx;
if ( e - s + 1 < 2 ) {
return s;
}
p_inx = s;
s++;
while(s <= e) {
if( s == e ) {
if(comp(list[p],list[e]) > 0) {
swap(list, p, e);
return e;
}
swap(list, p, e-1);
return e-1;
}
if (comp(list[p],list[s])>=0) {
s++;
continue;
}
if (comp(list[p],list[e])<=0) {
e--;
continue;
}
swap(list, s, e);
}
return p;
}
void quick_sort(void **list, int start, int end, compare comp)
{
int fi;
if(start >= end)
return;
fi = get_final_index(list, start, end, comp);
quick_sort(list, start, fi - 1, comp);
quick_sort(list, fi + 1, end, comp);
}
void swap(void **list, int a, int b)
{
void* tmp = NULL;
if(a==b)
return;
tmp = list[a];
list[a] = list[b];
list[b] = tmp;
}