簡單介紹幾種排序演算法

2021-07-25 08:35:37 字數 3939 閱讀 8708

#選擇排序

##簡單選擇排序

比如從小到大排序的話,從未排序序列中選出最小的和序列的首元素交換,然後再在剩下的未排序序列中選出最小的和序列的第二個元素交換,以此類推,最後形成從小到大的已排序序列。c語言**解釋如下:

void

******selectionsort

(elementtype a,

int n)

}//交換元素的值

temp=a[i]

; a[i]

=a[min]

; a[min]

=temp;

}}

##堆排序

字面意思就是用堆這種資料結構所設計的排序演算法。堆是一種特殊的二叉樹,每個子節點的值總是大於或小於他的父節點,相應的分為最小堆和最大堆。c語言解釋**:

void

ajust

(elementtype a,

int i,

int n)

if(temp)else

break;}

a[i]

=temp;

//將temp放到當前位置

}void

heapsort

(elementtype a,

int n)

for(i=n-

1;i>

0;i--

)}

#插入排序

##簡單插入排序

核心思想是將待排序的序列分為已排序序列和未排序序列。比如乙個未排序序列,直接預設已排序序列只有第乙個元素這種就行。c語言解釋**:

void

insertionsort

(elementtype a,

int n)

a[j]

=temp;

//將當前的temp元素放入合適位置

}}

##希爾排序

希爾排序是每次交換間隔一定距離的元素(比如1,3,6,4,5;取其中的1和4,就相當於間隔3;類似的直到間隔為1則完成了最終排序),c語言解釋**:

void

shellsort

(elementtype a,

int n,

int incre,

int m)}}

}

#交換排序

##氣泡排序

最簡單的交換排序,通過不斷迴圈將最大或者最小元素交換出來,放到未排序元素的最後。c語言解釋**:

void

bubblesort

(elementtype a,

int n)}if

(!flag)

break

;//如果一次未發生交換說明有序,跳出迴圈

}}

##快速排序

原理是將未排序的元素根據基準分為兩個子串行,乙個子串行均大於基準,另乙個均小於基準,然後遞迴的對這兩個子串行用類似方法排序。c語言解釋**:

//交換兩個元素的值

void

swap

(elementtype *a,elementtype *b)

void

qsort

(elementtype a,

int low,

int high)

//基準回到中間

swap

(&a[low]

,&a[right]);

//分別對左右兩個邊的序列繼續快排

qsort

(a,left,low-1)

;qsort

(a,low+

1,right);}

//執行快排

void

quiksort

(elementtype a,

int n)

#歸併排序

歸併排序是指將兩個已排序的子串行合成乙個有序序列的過程。原理是:可以將大小為n的序列看成n個長度為1的子串行,然後兩兩歸併,形成乙個n/2長度的長度為2的子串行有序序列,然後繼續將相鄰的子串行兩兩歸併,如此迴圈直到最後剩下乙個長度為n的序列。

//將兩個序列歸併

void

merge

(elementtype a[

],elementtype tmpa,

int left,

int mid,

int right)

while

(left<=leftend)

//滿足說明右邊序列元素已經沒了

//將剩餘的左邊元素複製到臨時序列

tmpa[tp++

]=a[left++];

while

(mid<=right)

//滿足說明左邊序列元素已經都沒了

//將剩餘的右邊元素複製到臨時序列

tmpa[tp++

]=a[mid++];

//將臨時序列放回到a中

for(i=right-left;i>=

0;i--

,right--)}

//遞迴排序

void

msort

(elementtype a[

],elementtype tmpa,

int left,

int right)

}//排序方法(執行方法)

void

mergesort()

#基數排序

基數排序可以看成桶排序。桶排序是將關鍵字的每個可能的取值建立乙個桶,掃瞄所有序列元素,按照關鍵字放入對應的桶中,然後再按照桶的順序收集一遍自然就有序。而基數排序屬於桶排序的一種推廣,所考慮的待排序記錄的關鍵字不止乙個。

對於一般有k個關鍵字的基數排序,通常有兩種方法:主位優先法(msd)和次位優先法(lsd)。

下面是次位優先法的c語言**解釋實現(有待研究):

typedef

struct node *ptrtonode;

typedef ptrtonode list;

struct node

;list radixsort

(list a)

else

rear[digit]

=a; a=a->next;

}for

(j=radix-

1;j>=

0;j--)}

}return a;

}

#各演算法效率比較

排序方法

平均時間複雜度

最壞情況的時間複雜度

額外的空間複雜度

穩定性簡單選擇排序

o(n2)

o(n2)

o(1)

不穩定簡單插入排序

o(n2)

o(n2)

o(1)

穩定氣泡排序

o(n2)

o(n2)

o(1)

穩定希爾排序

o(nd)

o(n2)

o(1)

不穩定堆排序

o(n log2n)

o(n log2n)

o(1)

不穩定快速排序

o(n log2n)

o(n2)

o(log2n)

不穩定歸併排序

o(n log2n)

o(n log2n)

o(n)

穩定基數排序

o(d(n+r))

o(d(n+r))

o(n+r)

穩定注:

1、穩定是指是否在排序後改變原有等值元素的順序。

2、基數排序中的d為分配收集的趟數,也就是關鍵字按基數分解後的位數

#以上參考文獻:高等教育出版社出版的陳越主編的《資料結構》

幾種簡單的排序演算法

整理了一下幾種簡單的排序演算法,暫時先貼上演算法,以後有時間在乙個乙個注釋 參考 下面是 部分 include 演算法1 氣泡排序,時間複雜度o n 2 基本思想 從最後乙個數開始,每次相鄰兩個數字比較,較小數往上浮動 void bubblesort int a,int c 演算法2 選擇排序,時間...

幾種簡單的排序演算法

1 插入排序 直接插入排序 希爾排序 2 交換排序 氣泡排序 快速排序 3 選擇排序 直接選擇排序 堆排序 4 歸併排序 5 分配排序 基數排序 所需輔助空間最多 歸併排序 所需輔助空間最少 堆排序 平均速度最快 快速排序 不穩定 快速排序,希爾排序,堆排序。1.直接插入排序 1 基本思想 在要排序...

幾種排序演算法簡單比較

1 選擇排序 選擇排序是一種不斷在剩餘元素找最小元素的方法,該排序與陣列大小無關,資料移動較少。首先找到陣列最小元素,將它和陣列第乙個位置元素交換。再在剩下元素找最小元素,和陣列第二個位置的元素交換,依次進行。2 插入排序 插入排序適合接近有序元素的排序。首先將陣列前兩個元素按公升序排列,然後將第三...