鏈錶快速排序

來源:互聯網
上載者:User
快速排序也是一種分治的遞迴排序演算法,它的原理是通過遞迴劃分元素集合,在每一個集合內選取一個基點,通過比較基點元素和集合內其他元素的值進行位置調整,使得基點左邊的元素值均不小於基點值,基點右邊的元素值均不大於基點值。

以下的實現中,先分配一個數組空間用於儲存串連件集合,空間的大小是鏈表計數N加2,首位用於存放開始邊界(LINK_FIRST),末位存放終止邊界(LINK_LAST),數組[1…n]為具體待排串連件,在每一次劃分中,如果區間為[m…n],則取m位為基點位,經過調整後,返回基點值的新位置p,下一次劃分則分為兩個區間[m,p-1]和[p+1,n]。

       串連件的值比較通過回呼函數實現。

 

XDL_API void QuickSortLink(LINKPTR root,LinkSortCall pf,void* parm);

/**//*

功能:對鏈表進行快速排序

參數:root為根串連件指標,pf為排序回呼函數,param為回調參數

返回:無

*/

//調整

int _PartSortLink(LINKPTR* pa,int i,int j,LinkSortCall pf,void* parm)

...{

       LINKPTR base,tmp;

       int n;

 

       if(i == j)

              return 0;

 

       n = i++;

       base = pa[n];

       do...{

              while(pa[i] != LINK_LAST && (*pf)(pa[i],base,parm) < 0)

                     i++;

 

              while(pa[j] != LINK_FIRST && (*pf)(pa[j],base,parm) > 0)

                     j--;

 

              if(i < j)

              ...{

                     tmp = pa[i];

                     pa[i] = pa[j];

                     pa[j] = tmp;

              }

       }while(i < j);

 

       pa[n]= pa[j];

       pa[j] = base;

 

       return j;

}

//劃分

void _QuickSortLink(LINKPTR* pa,int i,int j,LinkSortCall pf,void* parm)

...{

       int n;

 

       n = _PartSortLink(pa,i,j,pf,parm);

       if(n>i)

              _QuickSortLink(pa,i,n-1,pf,parm);

       if(n && n<j)

              _QuickSortLink(pa,n+1,j,pf,parm);

}

//快速排序

void QuickSortLink(LINKPTR root,LinkSortCall pf,void* parm)

...{

       LINKPTR* pa;

       int count,i;

 

       //alloc array for storing link point

       count = LinkCount(root);

       pa = (LINKPTR*)XdlAlloc(count + 2,sizeof(LINKPTR));

       pa[0] = LINK_FIRST;

       for(i=1;i<=count;i++)

              pa[i] = DeleteLink(root,LINK_FIRST);

       pa[count + 1] = LINK_LAST;

       //sort array

       _QuickSortLink(pa,1,count,pf,parm);

       

       //reinsert into link list

       for(i=1;i<=count;i++)

              InsertLink(root,LINK_LAST,pa[i]);

 

       XdlFree(pa);

}

collected by barenx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.