排序操作在程式設計中是非常基礎和常見的,也是演算法的基礎部分,我對幾種常見的比較排序演算法進行了整理。
思想:遍歷陣列,每次遍歷都在未排序的部分找到最小元素的下標,在此次遍歷結束後將最小元素放到遍歷開始的位置。
效能:時間複雜度為o(n2),演算法比較次數與初始序列狀態無關,效能在所有排序演算法中最差。
void violence_sort(int* a, intlen)
}}
思想:將當前元素與它前面已排好序的元素依次進行比較,最後放置在合適的位置,初始時可從第二個元素開始,認為第乙個元素已排好序。
效能:演算法時間複雜度為o(n2),在序列規模較小時,效能比較好,且元素比較次數與初始序列雜亂程度相關,最優複雜度為o(n)。
void insert_sort(int* a, intlen)
a[j+1] =key;
}}
思想:利用插入排序的思想,考慮到插入排序在序列基本有序且數量較少時效能較高,因此先對序列進行邏輯上的分組然後插入排序,如:設定初始增量為x,則0,0+x,0+x+x ...為一組,1,1+x,1+x+x ...為第二組,共有x組,分別進行排序。那個隨後減少增量,增加分組,直到增量為1。
效能:演算法時間複雜度為o(n1.3) -o(n2),效能取決於增量序列。
void shellsort(int a, intlen)
}}
思想:從左往右遍歷,比較相鄰兩個元素的大小,將大的乙個放在後面,每遍歷一趟,可找到乙個最大值放置在最後,經過n-1趟遍歷即可。
效能:時間複雜度為o(n
2),元素比較次數與初始狀態無關,效能略低於插入排序。
void bubble_sort(int* a,intlen)
}}
思想:使用分治思想,將原始序列分為兩部分分別排序,然後合併,重點在於合併過程。
效能:時間複雜度為o(nlgn),不過合併過程會使用額外的儲存空間,占用記憶體。
void merge(int a, int low, int mid, inthigh)
else
if(r > high)
else
if(cp[l-low] <= cp[r-low])
else
}}
void merge_sort(int a, int low, int
high)
}
思想:與歸併排序類似,也使用分治思想,選擇乙個元素值(一般選擇最後乙個元素),將比它小的放在左邊部分,比它大的放在右邊,然後對兩部分分別進行上述操作知道遞迴結束,關鍵步驟在於元素的分類,且只占用o(1)的額外儲存空間。
效能:時間複雜度為o(nlgn),與歸併排序不同,該演算法占用常數級額外儲存,在大規模序列排序應用中效能較好。
int patition(int* p, int left, intright)
p[left] =key;
return
left;
}void quick_sort(int* p, int left, int
right)
思想:使用堆資料結構進行排序,堆是一種用陣列儲存的二叉樹,根據父節點和子節點的大小關係分為最大堆和最小堆,這裡使用最大堆進行排序。
效能:時間複雜度為o(nlgn),在實際使用中,堆排序的排序效能通常遜與快速排序。
void max_heapify(int* a, int i,intsize)
}void build_max_heap(int* a, int
size)
void heap_sort(int* a, int
len)
}
C 實現排序演算法合集
氣泡排序 相鄰對比 template void bubblesort elementtype arr,int n 選擇排序 每次選出最大數從後往前排 template void selectsort elementtype a,int n tmp a n 1 i a n 1 i a maxindex...
排序演算法合集
每次排序將排序範圍內最小的值調換位置到最前面.雙指標的應用 include include using namespace std void bubblesort vector s int main bubblesort s for int i 0 i int s.size i cout 優化 當待...
排序演算法合集(Java)
public static void bubblesort int a 氣泡排序的時間複雜度為o n 2 是穩定的演算法 2.快速排序 public static void quicksort int a,int l,int r a i x quicksort a,l,i 1 quicksort a...