青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

快排的一種簡易寫法

   雖然簡易二字,因人而異。不過,寫一個快排確實并不需要過20行,超過幾分鐘時間的代碼。面試的時候,面試官確實會經常問起快排什么的。但是,大家上的入門課基本是使用嚴蔚敏老奶奶的教材,上面對于快排的講解我是不敢恭維的。至少上面關于快排的寫法,我是寫過好幾次之后都是沒掌握好的。后面,應該是看K&R的c語言程序設計時候,發現一種更簡便的partion方法,但是當時我也沒怎么掌握。這一切直到,寒假認真閱讀算法導論的時候。

   不用算法牛人,算法學得好或者對快排理解深刻的,不用把這篇文章看完了,相信你們都能在10分鐘之內寫一個正確的快排了。
   廢話少說,還是來講講如何保證10分鐘之內寫一個正確的快排,而且以后都能10分鐘之內寫出來,而不是此刻看了我說的這些胡言之后。
   
   快排的主函數大家都會,現在我給個簡易點的樣子:
void QuickSort(int* pnA, int nLen)
{
   if (nLen > 1)
   {
         int nP = Partion(pnA, nLen);
         QuickSort(pnA, nP);//排序第nP+1個元素前面的nP個元素
         QuickSort(pnA + nP + 1, nLen - nP - 1);//排序第nP+1個元素后面的元素
   }
}

那么現在就剩下Partion函數了。
我記得嚴蔚敏書上的寫法中Partion 函數里面是有幾個循環的。而且即使大概寫出來了,也很難處理正確邊界。
現在,我要說的就是算法導論上,作為教材內容出現的Partion函數。還是看代碼吧。
int Partion(int* pnA, int nLen)
{
   //這里選擇最后一個元素作為軸元素
   int i, j;
   for (i = j = 0; i < nLen - 1; ++i)
   {
      if (pnA[i] < pnA[nLen - 1])
      {
            swap(pnA[i], pnA[j];//交換2個數的函數,大家都能寫吧,stl中也有
            ++j;
      }
   }
   swap(pnA[j], pnA[nLen - 1]);
   return j;
}

   為了公平起見,上面的代碼我都是在blog上面直接敲的,寫這10多行代碼是絕對用不了10分鐘的。主遞歸函數大家都會寫,Partion函數里面只有一個for循環,所以只要明確了for循環的意思,快排的速寫就迎刃而解了。其實,按照算導的說法,這個for一直在劃分區間。區間[0,j-1]是小于最后一個元素的區間,[j,nLen - 2]是大于等于最后一個元素的區間,所以最后將第nLen-1個元素與第j個元素交換即可,Partion應該返回的值也應該是j。
   我不知道大家理解上面那句黑體字的話沒,如果理解了,隨便寫個快排是沒問題了。至少,可能的下次面試時候,可以瀟灑地寫個快排給面試官看看了,雖然這也許并不是什么值得慶幸的事情。


   算法導論里面的快速排序那章后面還有思考題,其中第一個思考題,提出的另外一種叫做Hoare劃分的partion寫法,意思就和嚴蔚敏書上的partion函數一致的。理解的關鍵是,軸元素一直處于被交換中。只要發現了這點,寫一兩次后,這種partion方法也能掌握好了,不過寫起來是循環嵌循環了,沒那么舒服。

posted on 2012-03-03 23:26 yx 閱讀(2736) 評論(9)  編輯 收藏 引用 所屬分類: 排序

評論

# re: 快排的一種簡易寫法 2012-03-04 14:35 xtao

你好,我看到了你的算法,但是認為有問題,
其中這段
for (i = j = 0; i < nLen - 1; ++i)
{
if (pnA[i] < pnA[nLen - 1])
{
swap(pnA[i], pnA[nLen - 1];//交換2個數的函數,大家都能寫吧,stl中也有
++j;
}
}

swap函數是否應該是這樣的
swap(pnA[i],pnA[j]);  回復  更多評論   

# re: 快排的一種簡易寫法 2012-03-04 14:44 遠行

這里確實寫錯了,不好意思,昨晚沒發現@xtao
  回復  更多評論   

# re: 快排的一種簡易寫法 2012-03-04 18:55 sms

你的這個快速排序算法應該沒有嚴蔚敏的快!  回復  更多評論   

# re: 快排的一種簡易寫法 2012-03-04 19:18 遠行

應該差不多吧,基本操作都是交換元素,而且這種寫法開始不會動軸元素@sms
  回復  更多評論   

# re: 快排的一種簡易寫法[未登錄] 2012-03-05 13:34 Chipset

你的速度不行,數據結構書上的更垃圾。  回復  更多評論   

# re: 快排的一種簡易寫法 2012-03-05 15:41 遠行

你可以給個更快的partion方法讓大家學習下@Chipset  回復  更多評論   

# re: 快排的一種簡易寫法[未登錄] 2012-03-05 17:17 Chipset

需要用到直接插入排序,堆排序和三點取中找支點,然后分割,有點麻煩,到這里去看怎么優化的:
http://m.shnenglu.com/Chipset/archive/2011/08/16/153546.html
或者把STLPort代碼下載下來去里面找,原理是一樣的。
我主頁上有常見的14種排序,如果單線程的話,快排是最快的,多線程需要重新設計,太麻煩,最容易實現并行的排序個人認為是歸并排序。  回復  更多評論   

# re: 快排的一種簡易寫法 2012-03-05 19:15 遠行

對于怎么并行排序確實沒思考過,不過快排很明顯的優化是隨機選取軸元素,三數取中選軸元素算導也提到過,還有你說的堆排優化快排,應該是只在遞歸到小數據量時候使用堆排了,不過小數量時候一直聽說使用插入速度更快,不過這些都是對快排的優化了,不是我寫這篇文章的意思,我是覺得有些人不一定看過算導,也不一定看過STL源碼,所以不一定知道很快的寫出基本的快排,所以寫下這個文章,也當作自己的學習記錄,另外你的文章很不錯,學習了@Chipset
  回復  更多評論   

# re: 快排的一種簡易寫法 2013-04-20 22:02 xt

http://www.cnblogs.com/morewindows/archive/2011/08/13/2137415.html
這個效率比較高  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2012年3月>
26272829123
45678910
11121314151617
18192021222324
25262728293031
1234567

導航

統計

公告

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

me

好友

同學

網友

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久www成人免费精品| 亚洲日本一区二区| 国产精品久久久久久久久婷婷| 欧美影院成人| 久久九九有精品国产23| 亚洲人永久免费| 久久久久国产精品一区三寸| 国产精品视频专区| 99精品视频免费| 亚洲东热激情| 欧美~级网站不卡| 亚洲第一精品夜夜躁人人爽| 老色批av在线精品| 久久精品人人| 一区二区三区在线视频观看| 久久综合中文字幕| 久久久久综合一区二区三区| 国内自拍亚洲| 亚洲欧美日韩国产一区| 欧美三级日韩三级国产三级 | 日韩视频免费| 亚洲国产精品一区| 欧美精品国产精品| 国产伦精品一区二区三区在线观看| 性久久久久久久久| 久久国产精品久久久久久| 国产日韩av一区二区| 欧美精品首页| 亚洲国产精品激情在线观看| 欧美mv日韩mv国产网站app| 欧美在线观看天堂一区二区三区| 国内自拍视频一区二区三区| 欧美va天堂va视频va在线| 欧美三级乱码| 久久精品夜色噜噜亚洲a∨| 欧美sm视频| 久久aⅴ乱码一区二区三区| 欧美亚洲一区三区| 日韩亚洲欧美中文三级| 亚洲一区在线播放| 亚洲国产午夜| 亚洲在线电影| 99www免费人成精品| 亚洲欧美一区二区视频| 国产美女精品| 日韩视频一区| 欧美成人在线影院| 国模精品娜娜一二三区| 亚洲最黄网站| 日韩视频中文| 久久久久99精品国产片| 国产亚洲福利| 久久国产精品一区二区| 在线观看国产一区二区| 91久久精品国产91性色| 国产精品不卡在线| 亚洲综合日韩在线| 久久高清免费观看| 久久成人免费日本黄色| 久久久久久69| 国产一区二区视频在线观看| 亚洲国产成人精品女人久久久| 国产精品久久久久久超碰| 久久综合激情| 国产精品久久久久久久久免费樱桃| 国产欧美一区二区白浆黑人| 奶水喷射视频一区| 国产精品区一区二区三区| 亚洲国产精品久久精品怡红院| 国产日韩欧美制服另类| 一区二区三区精品久久久| 91久久精品日日躁夜夜躁欧美| 亚洲欧美日韩精品久久久| 国产精品99久久久久久久女警| 浪潮色综合久久天堂| 久久婷婷国产综合国色天香| 国产精品一香蕉国产线看观看| 日韩小视频在线观看专区| 亚洲二区免费| 久久久精品五月天| 久久精品国产99精品国产亚洲性色| 欧美三级视频在线| 日韩一区二区电影网| 日韩一区二区精品视频| 米奇777在线欧美播放| 亚洲国产精品传媒在线观看| 亚洲欧美激情精品一区二区| 亚洲影院高清在线| 艳妇臀荡乳欲伦亚洲一区| 欧美国产专区| 亚洲一区一卡| 久久综合久久综合久久综合| 小嫩嫩精品导航| 91久久夜色精品国产网站| 日韩视频在线一区二区三区| 亚洲欧美国产日韩中文字幕| 欧美在线欧美在线| 欧美激情bt| 国产精品人人做人人爽| 亚洲第一区在线| 亚洲欧美成人一区二区在线电影| 香蕉久久a毛片| 欧美xart系列在线观看| 亚洲一区二区影院| 亚洲国产成人av| 午夜电影亚洲| 欧美人成网站| 亚洲精品1区| 久久免费一区| 亚洲精品在线二区| 亚洲视频在线免费观看| 久久人人爽人人爽爽久久| 亚洲精品国产欧美| 久久久99国产精品免费| 欧美午夜精品理论片a级大开眼界| 在线成人欧美| 欧美国产专区| 欧美成年网站| 亚洲精品在线三区| 欧美www视频| 欧美理论在线| 欧美午夜片欧美片在线观看| 欧美日韩中文字幕日韩欧美| 99亚洲视频| 亚洲美女毛片| 欧美性猛交视频| 久久五月激情| 欧美精品三级在线观看| 999在线观看精品免费不卡网站| 亚洲国产精品一区| 美女视频黄a大片欧美| 亚洲免费观看| 国产毛片一区二区| 猛男gaygay欧美视频| 欧美激情第10页| 亚洲欧美日韩第一区| 在线亚洲精品| 亚洲国产精品久久久久婷婷884 | 亚洲深夜激情| 欧美成人69av| 欧美激情精品久久久| 久久av老司机精品网站导航| 黄网动漫久久久| 欧美一二三区精品| 欧美高清视频在线| 久久久久久久国产| 国产精品久久97| 亚洲国产精品一区在线观看不卡 | 日韩网站在线看片你懂的| 欧美激情一区二区三区在线视频观看 | 麻豆精品精华液| 欧美欧美在线| 亚洲第一综合天堂另类专| 国产精品国色综合久久| 亚洲第一精品夜夜躁人人躁| 国产午夜亚洲精品不卡| 久久精品国产清高在天天线| 一区二区在线免费观看| 一本大道av伊人久久综合| 亚洲国产欧美日韩另类综合| 亚洲欧美自拍偷拍| 欧美在线中文字幕| 国产农村妇女毛片精品久久莱园子| 亚洲高清网站| 亚洲人成啪啪网站| 免费欧美视频| 日韩视频中午一区| 欧美国产综合视频| 欧美视频在线一区二区三区| 欧美一区二区视频在线观看2020| 亚洲精品日本| 欧美专区日韩专区| 欧美日韩在线播放一区| 女同一区二区| 韩国三级电影久久久久久| 午夜精品视频在线观看| 久久久精品网| 国产亚洲欧美日韩日本| 欧美人成在线| 欧美国产国产综合| 久久久久国产精品一区| 欧美在线3区| 亚洲欧美在线x视频| 亚洲天天影视| 亚洲一级片在线看| 亚洲色图制服丝袜| 一本色道久久综合狠狠躁篇的优点| 欧美高清在线视频观看不卡| 奶水喷射视频一区| 欧美**字幕| 国产农村妇女毛片精品久久麻豆 | 亚洲特色特黄| 日韩一二在线观看| 亚洲精品一区中文| 亚洲视频1区| 性色一区二区| 久久综合色天天久久综合图片| 欧美gay视频| 鲁大师影院一区二区三区| 久久er99精品|