關(guān)于列表的排序算法

  • 插入排序(insertionsort)
    算法的思路可簡(jiǎn)要描述為:始終將整個(gè)序列視作并切分為兩部分:有序的前綴,無(wú)序的后綴;通過(guò)迭代,反復(fù)地將后綴的首元素轉(zhuǎn)移至前綴中
    //對(duì)起始位置p的n個(gè)元素就行排序
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);
}
}

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

  • 選擇排序
    該算法也將序列劃分為無(wú)序前綴和有序后綴兩部分,此外,還要求前綴不大于后后綴。如此,每次只需從前綴中選出最大者,并作為最小元素轉(zhuǎn)移至后綴中,即可使有序部分的范圍不斷擴(kuò)張。
    //對(duì)起始于位置p的n個(gè)元素排序
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個(gè)元素中查找最大的元素
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;
}

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

  • 歸并排序
    1.二路歸并算法
    //有序列表的歸并:當(dāng)前列表自p起的n個(gè)元素,與列表L中自q起的m個(gè)元素歸并
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; //以中點(diǎn)為界
ListNode q = p; 
for (int i = 0; i < m; i++) 
q = q->succ; //均分列表
 mergeSort(p, m);
 mergeSort(q, n - m); //對(duì)前、后子列表分刪排序
 merge(p, m, *this, q, n - m); //歸并
}

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,829評(píng)論 0 15
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,303評(píng)論 0 52
  • 課程介紹 先修課:概率統(tǒng)計(jì),程序設(shè)計(jì)實(shí)習(xí),集合論與圖論 后續(xù)課:算法分析與設(shè)計(jì),編譯原理,操作系統(tǒng),數(shù)據(jù)庫(kù)概論,人...
    ShellyWhen閱讀 2,471評(píng)論 0 3
  • 今天是星期四下午有社團(tuán),今天在群里大家都在談元旦班里活動(dòng)的事。我忙了一天晚上回來(lái)才看見(jiàn)。我也報(bào)名參加了。老師說(shuō)還未定。
    二年級(jí)五班崔世昊閱讀 232評(píng)論 0 0
  • 既然沒(méi)有方向,我先背起行囊 何必迷茫,何必彷徨 我知道我的歸宿是遠(yuǎn)方 棄我而去的姑娘,你愛(ài)錦衣玉裳 何必悲傷、流連...
    馬岳閱讀 342評(píng)論 0 0

友情鏈接更多精彩內(nèi)容