算法草稿
代码实现
/* head 和 tail 的指针的排序的时候,都有可能发生变化,所以这里使用二级指针 */
int quickSortDoubList(st_doubNode** phead, st_doubNode ** ptail){
if(NULL == phead || NULL == *phead || NULL == ptail || NULL == *ptail){
printf("%s: param error\n",__func__);
return PARAM_ERR;
}
st_doubNode * head = NULL;
st_doubNode * tail = NULL;
st_doubNode * p = NULL;
st_doubNode * mov = NULL;
st_doubNode * prev = NULL;
st_doubNode * next = NULL;
st_doubNode * pivotpos = NULL;
int pivot = 0;
head = *phead;
tail = *ptail;
/*迭代退出的条件, 只有一个元素,或者没有元素*/
if(head == tail)
{
printf("\t exit resc head = %d \n", head->data);
return SUCCESS;
}
pivotpos = head;
pivot = pivotpos->data;
p = head;
while(NULL != p){
/*小于的移动到pivot之前*/
if(p->data < pivot){
mov = p; /*要移动的变量*/
p = p->next; /*下一轮位置变量*/
/*摘除*/
mov->prev->next = mov->next;
if(NULL != mov->next){
mov->next->prev = mov->prev;
} else { /*尾结点处理,mov是尾结点的时候*/
/*更新tail, 为新的尾结点*/
tail = mov->prev;
}
/*挂载*/
mov->next = head;
mov->prev = NULL;
head->prev = mov;
/*更新新的head*/
head = mov;
continue;
}
/*大于pivot不变*/
p = p->next;
}
#ifdef DEBUG
st_doubNode * q = NULL;
printf("\n---------------------------\n");
printf("\t[ ");
q = head;
while(q != pivotpos){
printf(" %d ", q->data);
q = q->next;
}
printf("] ");
printf(" pivot = %d ", q->data);
printf(" [ ");
q = pivotpos->next;
while(q != tail){
printf(" %d ", q->data);
q = q->next;
}
printf(" %d ", tail->data);
printf("] \n");
printf("---------------------------\n");
#endif
prev = pivotpos->prev;
next = pivotpos->next;
/*
* 对小的子链排序
* 注意 排序后,pivot 是第一个元素的时候,前面就没有元素了,不用排序了
* 这时候 prev 为 NULL,就不用在排序了
*/
if(prev != NULL){
quickSortDoubList(&head, &prev);
}
/*
* 对大的子链排序
* 注意 排序后,pivot 是最后一个元素的时候,后面就没有元素了,不用排序了
* 这时候 next 为 NULL,就不用在排序了
*/
if (next != NULL){
quickSortDoubList(&next, &tail);
}
/*因为next可能变化,重新连接*/
pivotpos->next = next;
next->prev = pivotpos;
*phead = head;
*ptail = tail;
return SUCCESS;
}
void testquickSortDoubList(void){
printf("\n************ testquickSortDoubList ************ \n");
st_doubNode * tail = NULL;
tail = getDouListTail(gDoubHead);
quickSortDoubList(&gDoubHead, &tail);
dumpDoubList(gDoubHead);
dumpDoubListReverse(gDoubHead);
return;
}
调试编译
gcc listMain.c doublist.c -o a.exe -DDEBUG
调试输出
========= Dump Double List 0x25ac010 ===========
22 32 19 53 0 47 29 116 4 6
===================================
========= dump DoubList Reverse 0x25ac130 ===========
6 4 116 29 47 0 53 19 32 22
================================================
************ testquickSortDoubList ************
---------------------------
[ 6 4 0 19 ] pivot = 22 [ 32 53 47 29 116 ]
---------------------------
---------------------------
[ 0 4 ] pivot = 6 [ 19 ]
---------------------------
---------------------------
[ ] pivot = 0 [ 4 ]
---------------------------
exit resc head = 4
exit resc head = 19
---------------------------
[ 29 ] pivot = 32 [ 53 47 116 ]
---------------------------
exit resc head = 29
---------------------------
[ 47 ] pivot = 53 [ 116 ]
---------------------------
exit resc head = 47
exit resc head = 116
========= Dump Double List 0x25ac090 ===========
0 4 6 19 22 29 32 47 53 116
===================================
========= dump DoubList Reverse 0x25ac0f0 ===========
116 53 47 32 29 22 19 6 4 0
================================================