資料結構 常見的7種比較排序演算法1

2021-07-13 08:54:32 字數 2687 閱讀 2879

● 直接插入排序(insert sort)

1、演算法描述:

該演算法是一種簡單直觀的是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上只需用到o(1)的額外空間的排序,因而在從後向前掃瞄過程中,需要反覆把已排序元素逐步向後挪位為最新元素提供插入空間。

2、步驟:

1)從第乙個元素開始,該元素可以認為已經被排序

2)取出下乙個元素,在已經排序的元素序列中從後向前掃瞄

3)如果該元素(已排序)大於新元素,將該元素移到下一位置

4)重複步驟3,直到找到已排序的元素小於或者等於新元素的位置

5)將新元素插入到該位置中

6)重複步驟2 

插入排序在對幾乎已經排好序的資料操作時,效率高,即可以達到

線性排序

的效率,但插入排序一般來說是低效的, 因為插入排序每次只能將資料移動一位。

具體實現如下:

void insertsort(int *arr, size_t size)//直接插入排序

arr[end + 1] = tmp;

}}

● 希爾排序(shell sort)

1、演算法描述:

希爾排序,也稱遞減增量排序演算法,是插入排序的一種高速而穩定的改進版本。希爾排序是基於插入排序而提出改進方法的。設定增量為gap=size/3+1,在gap不為1時,希爾排序是在進行預排序,在gap==1時,進行插入排序時,可提高效率。

2、步驟:

1)設定增量gap為size

2)使gap=gap/3+1,同時對所有組進行插入排序,直到size-gap-1時,表示所有組已經排序完成

3)重複步驟2,直到gap為1時停止

具體實現如下:

void shellsort(int *arr, size_t size)//希爾排序

arr[end + gap] = tmp;

} }}

● 選擇排序(select sort)

1、演算法描述:

首先在未排序序列中找到最小和最大元素,存放到排序序列的兩端,然後,再從剩餘未排序元素中繼續尋找最小和最大元素,然後放到排序序列(該序列縮短了2個元素,不包含原序列的兩端)兩端。以此類推,直到所有元素均排序完畢。

2、步驟:

1)一重迴圈:通過i和size控制進行尋找最小和最大元素的區間

2)使min為區間的首位元素位置,max為區間的末尾元素位置

3) 二重迴圈:從序列中尋找最小和最大元素,注意在進行不斷比較過程中進行交換,不能在找到的它們的下標後才進行交換。

具體實現如下:

void selectsort(int *arr, size_t size)

if (arr[j] > arr[max])}}}

● 堆排序(heap sort)

1、演算法描述:

堆積排序(heapsort)是指利用堆這種資料結構所設計的一種排序演算法。堆是乙個近似

完全二叉樹

的結構,並同時滿足堆性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。

公升序序列的實現需要建立大堆,降序序列的實現需要建立小堆。下面對公升序序列的實現進行分析。

2、步驟:

1)大堆的建立:通過下調建立大堆,先比較左右子結點的大小,使child指向較大數,再比較父親結點的child所指資料的大小,小於孩子結點就進行交換。

2)每次使堆的左右子樹為大堆,故從下向上進行大堆的建立

3)交換堆頂元素的堆的最後乙個元素,然後重新使堆(不包含最後乙個元素)成為大堆

4)重複步驟3,直到堆中只有乙個元素為止

具體實現如下:

void adjustdown(int* arr, size_t parent, size_t size)//建大堆(每次選出最大的放在後面)

if (arr[child] > arr[parent])

else

}}void heapsort(int *arr, size_t size)//公升序(大堆),降序(小堆)

for (size_t i = 0; i 

}

● 氣泡排序(bubble sort)

1、演算法描述:

重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤(公升序的)就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換(flag==0),也就是說該數列已經排序完成。該演算法是越小的元素會經由交換慢慢「浮」到數列的頂端。

2、步驟:

1)設定標誌flag。

2)從開始第一對到結尾的最後一對,比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。

3)如果flag==0,則在進行一趟比較後沒有發生交換,則序列已經有序了。

4)持續每次對越來越少的元素重複步驟2、3,總共進行了size-1趟。

具體實現如下:

void bubblesort(int *arr, size_t size)//氣泡排序,依次將大資料存放在後面

} if (flag == 0)//一趟結束後沒有一次交換,跳出迴圈

} }

本文出自 「scen」 部落格,請務必保留此齣

常見的7種排序演算法

1 氣泡排序 最簡單的一種排序演算法。先從陣列中找到最大值 或最小值 並放到陣列最左端 或最右端 然後在剩下的數字中找到次大值 或次小值 以此類推,直到陣列有序排列。演算法的時間複雜度為o n 2 氣泡排序 void bubblesort int arr,int length 2 選擇排序 嚴蔚敏版...

資料結構 各種排序演算法比較

一,各種排序演算法比較 各種排序演算法比較 二,相關概念 1 穩定排序和非穩定排序 簡單地說就是所有相等的數經過某種排序方法後,仍能保持它們在排序之前的相對次序,我們就說這種排序方法是穩定的。反之,就是非穩定的。比如 一組數排序前是a1,a2,a3,a4,a5,其中a2 a4,經過某種排序後為a1,...

《資料結構》 內部排序演算法比較

題目 各種內部排序演算法的時間複雜度分析結果只給出了演算法執行時間的階,或大概執行時間。試通過隨機的資料比較各演算法的關鍵字比較次數和關鍵字移動次數,以取得直觀感受。基本要求 1 從以下常用的內部排序演算法至少選取5種進行比較 直接插入排序 折半折入排序 希爾排序 起泡排序 快速排序 簡單選擇排序 ...