八大排序(C语言)
八大排序(C語言)
2019-10-08 19:43:57 Sunshinebaekhyun 閱讀數 1139更多 分類專欄: 八大排序 版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。 本文鏈接:https://blog.csdn.net/Gunanhuai/article/details/102407016void BubbleSort();//冒泡
void SelectSort();//選擇
void InsertSort();//直接插入
void ShellSort();//希爾
void HeapSort();//堆排
void QuickSort();//快排
void MegerSort();//歸并
void RadixSort();//基數(桶排序)
冒泡:
1)比較相鄰的元素。如果第一個比第二個大,就交換他們兩個;
2)對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。這步做完后,最后的元素會是最大的數;
3)針對所有的元素重復以上的步驟,除了最后一個;
4)持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
選擇:
1)首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置;
2)再從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾;
3)重復第二步,直到所有元素均排序完畢。
直接插入:
插入排序是一種最簡單直觀的排序算法,它的工作原理是通過構建有序序列,對于未排序數據,在已排序序列中從后向前掃描,找到相應位置并插入。
算法步驟:
1)將第一待排序序列第一個元素看做一個有序序列,把第二個元素到最后一個元素當成是未排序序列;
2)從頭到尾依次掃描未排序序列,將掃描到的每個元素插入有序序列的適當位置(相同則插入相等元素后邊)。
希爾(遞減增量排序算法):
核心思想:先將整個待排序的記錄序列分割成為若干子序列分別進行直接插入排序,待整個序列中的記錄“基本有序”時,再對全體記錄進行依次直接插入排序。
1)選擇一個增量序列d[1],t[2],…,d[k],其中d[i]>d[j],d[k]=1;
2)按增量序列個數k,對序列進行k 趟排序;
3)每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m 的子序列,分別對各子表進行直接插入排序。僅增量因子為1 時,整個序列作為一個表來處理,表長度即為整個序列的長度。
堆排:
快排:
歸并:
基數排序:
基數排序是一種非比較型整數排序算法,其原理是將整數按位數切割成不同的數字,然后按每個位數分別比較。
1.算法排序的時間復雜度:
時間復雜度o(n^2)
冒泡排序,選擇排序,插入排序
時間復雜度o(n*logn)
歸并排序,快速排序,堆排序,希爾排序
時間復雜度o(n)
基數排序
2.算法排序的空間復雜度
o(1)
冒泡排序,選擇排序,插入排序,堆排序,希爾排序
o(nlogn)
快速排序
o(N)
歸并排序
o(M)
基數排序
3.穩定性:相同值的元素排序前和排序后值保持不變
穩定的排序算法:冒泡排序,插入排序,歸并排序,基數排序;
不穩定的排序算法:選擇排序,快速排序,堆排序,希爾排序;
4.不穩定原因:
選擇排序原因:在選擇最小值和位置為0的數交換的時候產生;
快速排序原因:在隨機選擇相同值中間的數的,兩邊的相同值的不不是被劃分到選擇值得左邊就是選擇值的右邊;
堆排序原因:在每次建立大根堆后,堆頂元素會換到最后的位置上去;
希爾排序:步長為2時,第二個1跳兩部,造成了不穩定;
詳情見代碼注釋
總結
- 上一篇: c++中的左移、右移运算
- 下一篇: JLink接口的SWD接法