幾種排序演算法

2021-10-12 16:25:09 字數 2244 閱讀 9706

向已經排好序的序列依次插入元素

時間複雜度:

迴圈的巢狀,為 o(n^2)

如果序列已經被排好序,則為 o(n) (因為內部的』for』不起作用)

含有x個逆序對數,則需要做x次交換操作

含有n個元素的陣列,最多有 n(n-1)/2個逆序對數,平均 n(n-1)/4個

演算法的平均時間複雜度為 ω(n^2)

**如下:

void

insert_sort

(int a[

],int num)

//a為要排序的陣列,num為陣列元素個數,下同

a[j]

=tmp;

}}

將區間拆分,間隔為increment,每隔increment,用insert排序

之前已經降低了逆序數,因此再用insert排序會快很多

希爾排序的時間複雜度取決於increment的選取

increment很差的情況下,有可能在increment>1是,均不進行排序,全部放到increment=0是完成

希爾increment的取法:h(t)=[n/2] h(t+1)=[h(t)/2]

時間複雜度的上界為 θ(n^2)

hibbard increment的取法: 1,3,7,…,2^k-1 (更好)

時間複雜度上界為 θ(n^3/2)

**如下:

void

shell_sort

(int a[

],int num)

}}

先建大根堆,後依次將堆頂與堆尾交換,完成新堆頂的下沉(以已排好的元素前乙個元素為堆尾)

時間複雜度:

建堆 o(n)

堆的刪除 每次o(log(n)) 總共o(nlog(n))

總共 o(nlog(n))

#define leftchild

(i)(

2*i+1)

void

swap

(int *a,int *b)

//交換函式

void

percdown

(int a[

],int i,int num)

//堆下沉排序,從第i號元素向下維護堆為大根堆

a[i]

=tmp;

}void

heap_sort

(int a[

],int num)

}

void

merge

(int a,

int tmparr,

int lp,

int rp,

int re)

while

(lp<=le)

tmparr[tp++

]=a[lp++];

while

(rp<=re)

tmparr[tp++

]=a[rp++];

for(i=

0;i,re--

) a[re]

=tmparr[re];}

void

msort

(int a,

int tmparr,

int left,

int right)

}void

merge_sort

(int a,

int num)

else

printf

("no space for tmparr\n");

return

;}

int

median3

(int a,

int left,

int right)

void

qsort

(int a,

int left,

int right)

swap

(&a[i]

,&a[right-1]

);qsort

(a,left,i-1)

;qsort

(a,i+

1,right);}

else

insert_sort

(a+left,right-left+1)

;}void

quick_sort

(int a,

int num)

幾種排序演算法

幾種比較常見的排序演算法 第一種 函式功能 雙向氣泡排序 2013.7.8 時間複雜度o n 2 include void mp int array,int n if mmax 0 沒有記錄交換,掃瞄結束 break bmax mmax for i bmax 1 i bmin i 此次掃瞄使輕氣泡上...

幾種排序演算法

本帖依據學習進度持續更新 資料結構與演算法分析 c語言描述 學到第七章,是時候該系統的學習一下排序演算法了。首先學到的是插入排序,演算法就不贅述了,書上部落格上到處都有。書上的兩個定理還不太明白 插入排序 定理7.1 n個互異數的陣列的平均逆序數是n n 1 4。定理7.2 通過交換相鄰元素進行排序...

幾種排序演算法

最近一直在複習演算法,在經歷了四次面試之後,還沒有找到適合自己的工作 暫時歇一歇,準備冬天去北京創業一條街吹泡泡去。在面試過程中主要提及的就是對於排序演算法的疑問 主要針對以下幾種排序演算法 1,氣泡排序 2,插入排序 3,選擇排序 4,希爾排序 5,歸併排序 6,快速排序 7,堆排序 對於基數排序...