一:插入排序
①直接插入排序
//以從小到大排序為例
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被換到了第二位,最後...