關于列表的排序算法

  • 插入排序(insertionsort)
    算法的思路可簡要描述為:始終將整個序列視作并切分為兩部分:有序的前綴骤宣,無序的后綴慌随;通過迭代骇窍,反復地將后綴的首元素轉移至前綴中
    //對起始位置p的n個元素就行排序
void insertionsort(ListNode p,int n){
for (int r = 0; r < n; r++) {
 insertAfter(search(p->data, r, p), p->data); 
 p = p->succ;
 remove(p->pred);
}
}

復雜度是O(n^2),是穩(wěn)定算法

  • 選擇排序
    該算法也將序列劃分為無序前綴和有序后綴兩部分,此外矗晃,還要求前綴不大于后后綴看疙。如此,每次只需從前綴中選出最大者浦旱,并作為最小元素轉移至后綴中宇色,即可使有序部分的范圍不斷擴張。
    //對起始于位置p的n個元素排序
void selectionSort(ListNode p,int n){
ListNode header=p.pred,ListNode trailer=p;
for(int r=0,r<n,r++){
trailer=trailer.succ;
}//待排序區(qū)間為(header,trailer)
while(1<n){
ListNode max=selectMax(header.succ,n);//找出最大者
insertBefore(trailer,remove(max));//作為有序區(qū)間的首元素
trailer=trailer.pred;
n--;
}
}
//從位置p起始的n個元素中查找最大的元素
ListNode selectMax(ListNode p,int n){
ListNode max=p;
for(ListNode curr=p;1<n;n--){
if((curr=curr.succ).data>=max){
max=curr;
}
return max;
}

該算法復雜度為O(n^2),從selectMax方法著手,可整體優(yōu)化為O(nlogn)

  • 歸并排序
    1.二路歸并算法
    //有序列表的歸并:當前列表自p起的n個元素,與列表L中自q起的m個元素歸并
void merge(ListNode p,int n,List T,ListNode q,int m){
ListNode pp=p.pred;
while(m>0){
if((n>0)&&(p.data<=q.data)){
  if(q==(p=(p.succ))){
break;
n--;
}
  }
else{
insertBefore(p,L.remove((q=q.succ).pred));
m--;
}
p = pp->succ;
}

2.分治策略

void mergeSort(ListNode p, int n) { 
if (n < 2)
 return; //若待排序范圍已足夠小颁湖,則直接返回宣蠕;
int m = n >> 1; //以中點為界
ListNode q = p; 
for (int i = 0; i < m; i++) 
q = q->succ; //均分列表
 mergeSort(p, m);
 mergeSort(q, n - m); //對前、后子列表分刪排序
 merge(p, m, *this, q, n - m); //歸并
}

總體算法復雜度是O(nlogn)

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末甥捺,一起剝皮案震驚了整個濱河市抢蚀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌镰禾,老刑警劉巖皿曲,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唱逢,死亡現(xiàn)場離奇詭異,居然都是意外死亡屋休,警方通過查閱死者的電腦和手機坞古,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劫樟,“玉大人痪枫,你說我怎么就攤上這事〉蓿” “怎么了奶陈?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長附较。 經(jīng)常有香客問我吃粒,道長,這世上最難降的妖魔是什么翅睛? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任声搁,我火速辦了婚禮黑竞,結果婚禮上捕发,老公的妹妹穿的比我還像新娘。我一直安慰自己很魂,他們只是感情好扎酷,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遏匆,像睡著了一般法挨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幅聘,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天凡纳,我揣著相機與錄音,去河邊找鬼帝蒿。 笑死荐糜,一個胖子當著我的面吹牛,可吹牛的內容都是我干的葛超。 我是一名探鬼主播暴氏,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绣张!你這毒婦竟也來了答渔?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤侥涵,失蹤者是張志新(化名)和其女友劉穎沼撕,沒想到半個月后宋雏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡务豺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年好芭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冲呢。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡舍败,死狀恐怖,靈堂內的尸體忽然破棺而出敬拓,到底是詐尸還是另有隱情邻薯,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布乘凸,位于F島的核電站厕诡,受9級特大地震影響,放射性物質發(fā)生泄漏营勤。R本人自食惡果不足惜灵嫌,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望葛作。 院中可真熱鬧寿羞,春花似錦、人聲如沸赂蠢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虱岂。三九已至玖院,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間第岖,已是汗流浹背难菌。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蔑滓,地道東北人郊酒。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像烫饼,于是被迫代替她去往敵國和親猎塞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容

  • 概述:排序有內部排序和外部排序杠纵,內部排序是數(shù)據(jù)記錄在內存中進行排序荠耽,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,729評論 0 15
  • 概述 排序有內部排序和外部排序比藻,內部排序是數(shù)據(jù)記錄在內存中進行排序铝量,而外部排序是因排序的數(shù)據(jù)很大倘屹,一次不能容納全部...
    蟻前閱讀 5,168評論 0 52
  • 課程介紹 先修課:概率統(tǒng)計,程序設計實習慢叨,集合論與圖論 后續(xù)課:算法分析與設計纽匙,編譯原理,操作系統(tǒng)拍谐,數(shù)據(jù)庫概論烛缔,人...
    ShellyWhen閱讀 2,265評論 0 3
  • 今天是星期四下午有社團,今天在群里大家都在談元旦班里活動的事轩拨。我忙了一天晚上回來才看見践瓷。我也報名參加了。老師說還未定亡蓉。
    二年級五班崔世昊閱讀 188評論 0 0
  • 既然沒有方向晕翠,我先背起行囊 何必迷茫,何必彷徨 我知道我的歸宿是遠方 棄我而去的姑娘砍濒,你愛錦衣玉裳 何必悲傷淋肾、流連...
    馬岳閱讀 305評論 0 0