日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

双向链表的快速排序

發布時間:2023/12/2 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 双向链表的快速排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

#include <stdio.h> #include <stdlib.h> #include <time.h> //定義類型 所有的排序例子中都是用的int作為data typedef int elemType; //返回值 #define RET_SUCCESS ( 1 ) #define RET_FAILED ( 0 ) //定義鏈表的長度 #define LIST_MAX_SIZE (10) //定義鏈表申請內存不夠時報錯信息 #define NO_MEMORY printf("Error! Not enough memory!/n");exit(1) //雙向鏈表結構體定義 typedef struct tagDuNode_t {elemType data; struct tagDuNode_t * pstNext; struct tagDuNode_t * pstPrior; }duNode_t; //初始化雙向鏈表 int initDuList(duNode_t ** pstHead) {int iRet = RET_SUCCESS;int iCir = 0;duNode_t * pstTmp1 = NULL;duNode_t * pstTmp2 = NULL;//初始化頭節點* pstHead = (duNode_t *)malloc(sizeof(duNode_t));(* pstHead)->pstPrior = NULL;(* pstHead)->pstNext = NULL;if ( !pstHead ){NO_MEMORY;}pstTmp1 = * pstHead;//鏈表初始化srand( time(NULL) );//隨機數for( iCir = 0; iCir < LIST_MAX_SIZE; iCir++ ){pstTmp2 = (duNode_t *)malloc(sizeof(duNode_t));if ( !pstTmp2 ){NO_MEMORY;}//賦初值pstTmp2->data = rand() % LIST_MAX_SIZE;pstTmp2->pstNext = NULL;pstTmp1->pstNext = pstTmp2;pstTmp2->pstPrior = pstTmp1;pstTmp1 = pstTmp2;} return iRet; } // 打印鏈表 鏈表的data元素是可打印的整形 int showDuList(duNode_t * pstHead) {int iRet = RET_SUCCESS;duNode_t * pstTmp = pstHead->pstNext;if ( NULL == pstHead ){printf("鏈表的頭節點是空/n");iRet = RET_FAILED;}else{while ( pstTmp ){printf("%d ", pstTmp->data);pstTmp = pstTmp->pstNext;}printf("/n");}return iRet; } /* 刪除包括頭節點在內的所有的節點. 07/04/28 */ int destroyList(duNode_t * pstHead) {duNode_t * pstTmp = NULL; /* Temp pointer for circle */int iRet = RET_SUCCESS;if ( !pstHead ){printf("Error! pstHead is null/n");iRet = RET_FAILED;}else{while ( pstHead ) /* Free nodes */{pstTmp = pstHead;pstHead = pstHead->pstNext;free(pstTmp);}pstHead = NULL;}return iRet; }/* End of destroyList----------------------------------------------*/ //正確的快速排序 2007/05/09 /*一趟快速排序的具體做法是:附設兩個指針low和high(即第一個和最后一個指針),他們的初值分別為low和high設樞軸(一般為low的值pivot)記錄的關鍵字(即本例子中的整形data)為pivot,則首先從high所指位置起向前搜索到第一個關鍵字小于pivot的記錄和樞軸記錄交換,然后從low所指位置起向后搜索,找到第一個關鍵字大于pivot的記錄和樞軸記錄相互交換,重復這兩步直至low = high為止。 */ duNode_t * partion(duNode_t * pstHead, duNode_t * pstLow, duNode_t * pstHigh) {elemType iTmp = 0;elemType pivot = 0;if ( !pstHead ){printf("錯誤,頭節點為空!/n");exit(1);}if ( !pstHead->pstNext ){return pstHead->pstNext;//就一個元素} pivot = pstLow->data;while ( pstLow != pstHigh ){//從后面往前換while ( pstLow != pstHigh && pstHigh->data >= pivot ){pstHigh = pstHigh->pstPrior;}//交換high lowiTmp = pstLow->data;pstLow->data = pstHigh->data;pstHigh->data = iTmp;//從前往后換while ( pstLow != pstHigh && pstLow->data <= pivot ){pstLow = pstLow->pstNext;}//交換high lowiTmp = pstLow->data;pstLow->data = pstHigh->data;pstHigh->data = iTmp;}return pstLow; } //快排 void quick_sort(duNode_t * pstHead, duNode_t * pstLow, duNode_t * pstHigh) {duNode_t * pstTmp = NULL;pstTmp = partion(pstHead, pstLow, pstHigh);if ( pstLow != pstTmp ){quick_sort(pstHead, pstLow, pstTmp->pstPrior);}if ( pstHigh != pstTmp ){quick_sort(pstHead, pstTmp->pstNext, pstHigh);}} void main() {duNode_t * pstHead = NULL;duNode_t * pstHigh = NULL;duNode_t * pstTmp = NULL;initDuList(&pstHead); //初始化printf("Before sorting:/n");showDuList(pstHead); //打印pstTmp = pstHead->pstNext;while ( pstTmp->pstNext ){pstTmp = pstTmp->pstNext;}pstHigh = pstTmp;//找到最后一個節點的指針用于快排時quick_sort(pstHead, pstHead->pstNext, pstHigh);//快排序printf("After sorting:/n");showDuList(pstHead);destroyList(pstHead);pstHead = NULL; }

轉載于:https://www.cnblogs.com/mtcnn/archive/2012/07/05/9410126.html

總結

以上是生活随笔為你收集整理的双向链表的快速排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。