九種排序演算法

2021-08-14 05:37:53 字數 2673 閱讀 5812

一:插入排序

①直接插入排序

//以從小到大排序為例

void insertsort(int a,int

len)}}

直接插入排序最好的情況就是不需要移動,直接就是乙個從大到小排好的順序,那麼就只需要比較一遍就可以了(不需要移動《交換》),時間複雜度為o(n),最差的情況下需要全部移動一遍,就是按照從小到大的順序排的,那麼,時間複雜度o(n²)空間複雜度為o(1),因為只需要乙個資料儲存要插入的資料即可,是乙個穩定的排序演算法鏈式儲存也可以用比較適合基本有序的資料

②折半插入排序

#include

using

namespace

std;

void binsertsort(int a,int len)

//cout

for(j=i-1;j>=high+1;j--)

a[j+1]=a[j];

a[high+1]=temp;}}

折半插入比較的時間不依賴於初始資料順序,是乙個固定的值,所以平均來看較直接插入排序減少了,但是在初始資料基本有序的時候,還是直接插入比較的次數少。

折半插入並沒有縮減移動的次數,與直接插入一致,移動的次數依賴於初始資料的順序。所以折半插入排序的時間複雜為****o(n²)

折半插入排序是一種穩定的演算法,因為涉及到折半,所以不適合鏈式儲存結構。

比較適合n比較大,原始資料無序。

空間複雜度o(1)

③希爾排序演算法

void shellinsert(int a,int dk,int

len)

} }int dk=;

void shellsort(int a,int dt,int t,int

len)

希爾排序的要有乙個「直接插入函式」,乙個計量步長的陣列,乙個函式控制希爾排序。

因為直接插入排序法在初始序列基本有序的時候會有很好的效果,所以希爾排序就先「粗略」排序,以達到初始序列基本有序的效果,步長必須包括1且彼此之間互質。

希爾插入其實就是在步長的控制下,把原始序列中的幾個數挑出來。

時間複雜度不清楚,大概n的1.3次方,空間複雜度為o(1),不適合鏈式排序,適合資料量大,無序的時候。

二:交換排序

①氣泡排序

void bubblesort(int a,int

len)}}

}

氣泡排序的想法就是每次換過去乙個(未排序中的)最大的,然後直到不需要換。

這個比我大一寫的氣泡排序多了乙個flag變數,如果一趟排序下來沒有移動元素,那就不用下一趟排序了,機智!

時間複雜度是o(n²),空間複雜度是o(1),適合於鏈式儲存結構,移動次數太多,演算法效率不高。

②快速排序

int partition(int a,int low,int high)

a[low]=temp;

return low;

} void qsort(int a,int low,int high)

}

快排排序依次排序可以消除多個逆序,快排的時間複雜度為o(nlog2n),空間複雜度因為用了遞迴,執行時需要乙個棧來儲存資料,所以最好的情況下是o(log2n),最壞的情況下為o(n)。

屬於不穩定的排序演算法,不適合於鏈式儲存結構。

三:選擇排序

①簡單選擇排序

void selectsort(int a,int

len)}}

簡單選擇排序就是每一趟找出最小的乙個,換到合適的位置上!簡單選擇排序主要是比較用的時間多,所以時間複雜度為o(n²),空間複雜度為o(1)。

穩定排序(也可以不穩定),可用於鏈式儲存結構。

②樹形選擇排序

樹形選擇排序又稱錦標賽排序,比如8個人比賽,選出前三名,最少需要比11次。

③堆排序

void heapadjust(int a,int s,int m)

a[s]=rc;

}void creatheap(int a,int

len)

void heapsort(int a,int

len)

}

堆排序是建立在完全二叉樹的基礎上的,但其實是乙個線性表儲存的,主要有兩個函式,調整堆和建堆,其實核心就是調整堆。

先把乙個無序的序列建成大根堆,然後固定乙個最大的,然後把剩下的再調整為乙個大根堆,在固定一次。

調整堆就是從第乙個非葉子結點開始,向下尋找,找到大的那個就換。

堆排序的時間複雜度o(nlog2n),空間複雜度o(1)

四:歸併排序

歸併排序時間複雜度為o(nlog2n),空間複雜度o(n)

排序演算法(九) 桶排序

桶排序是將待排序集合中處於同乙個值域的元素存入同乙個桶中,也就是根據元素值特性將集合拆分為多個區域,則拆分後形成的多個桶,從值域上看是處於有序狀態的。對每個桶中元素進行排序,則所有桶中元素構成的集合是已排序的。快速排序是將集合拆分為兩個值域,這裡稱為兩個桶,再分別對兩個桶進行排序,最終完成排序。桶排...

排序演算法(九) 總結

1 演算法分類 根據演算法採用的主要操作,可以將演算法分為 插入排序 交換排序 歸併排序 選擇排序四大類,前面介紹的七種演算法分別歸屬這四大類。排序演算法 插入排序 交換排序 選擇排序 歸併排序 插入排序 希爾排序 氣泡排序 快速排序 選擇排序 堆排序歸併排序 從演算法的簡單性來看,又可分為 簡單演...

氣泡排序演算法(九)

氣泡排序是通過交換相鄰資料來達到排序目的。排序有按從小到大排序,也有按從大到小來排序。假設有一組資料,個數為n 10 6 8 5 12 現在要用用氣泡排序從小到大排序,怎麼排?第一步 我先從後面開始比較,5和12比較不交換,8和5比較交換,5被換到了第三位,然後6和5比較交換,5被換到了第二位,最後...