双向链表的快速排序 -- C语言

算法草稿

代码实现

/* 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
================================================
发布了191 篇原创文章 · 获赞 43 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/leoufung/article/details/104384995