這是對個人對於排序演算法回顧和複習,所以可能寫的很省略。如果之前沒有學過可以看看參考列的部落格。這篇部落格在秋招後會刪掉。寫的太low了o(╯□╰)o
通過前後相鄰元素進行比較一次最大或最小值放到最後,思想很簡單,不細說。
void bubblesort(int a, int n)}}
}
初始時在序列中找到最小(大)元素,放到序列的起始位置作為已排序序列;然後,再從剩餘未排序元素中繼續尋找最小(大)元素,放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
第一趟第二趟
第三趟第四趟
第五趟第六趟
第七趟
void selectsort(int a,int n)
第一趟:
第二趟:
第三趟:
第四趟:
第五趟:
第六趟:
第七趟:
偽**void insertsort(int a,int n)
}
演算法思路:
先取乙個正整數 d1(d1 < n),把全部記錄分成 d1 個組,所有距離為 d1 的倍數的記錄看成一組,然後在各組內進行插入排序
然後取 d2(d2 < d1)
重複上述分組和排序操作;直到取 di = 1(i >= 1) 位置,即所有記錄成為乙個組,最後對這個組進行插入排序。一般選 d1 約為 n/2,d2 為 d1 /2, d3 為 d2/2 ,…, di = 1。
其中d1一般為n/2
還是以前面的序列為例
令d1=4
可以將上面分成四組,,,
然後進行插入排序,,,
第一趟結果
d2=2
分成兩組,
第二趟,
所以最終結果為
d3=1
最終結果
void shellsort(int a,int n)
a[j+d1]=temp;
}p++;
}d1=d1/2;
}}
歸併排序演算法主要依賴歸併(merge)操作。歸併操作指的是將兩個已經排序的序列合併成乙個序列的操作,歸併操作步驟如下:
申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列
設定兩個指標,最初位置分別為兩個已經排序序列的起始位置
比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置
重複步驟3直到某一指標到達序列尾
將另一串行剩下的所有元素直接複製到合併序列尾
l=4時,遞迴分組為,
l=2時,遞迴分組為,,,
l=1時,遞迴分組為,,,,,,,.
合併l=2 ,,,
l=4 ,
l=8
void merge(int *a,int s,int m,int n)
並且如果二叉樹的序列是從0開始(對應陣列下標從0開始)
則有葉子節點和根節點序列i的關係式為
以序列為例
構建堆的時候構建順序是從下往上從右往左的進行。在構建過程中會破壞堆,這時候需要調整。調整的時候順序是從上往下的。
//堆排序
void heapadjust(int a,int s,int m)
a[s]=temp;
}void heapsort(int a,int n)
}
很經典,不多講。
int partition(int a,int low,int high)
{ int t=a[low];
while(lowt&&low常用排序演算法總結
排序演算法總結
1 直接插入排序 1 穩定性 穩定 2 適用情況 待排記錄規模較小,或者記錄已經基本有序 2 希爾排序 1 穩定性 不穩定 2 特點 希爾排序的執行時間依賴於增量序列,它的效率比直接插入排序有較大的改進。3 氣泡排序 1 穩定性 穩定 2 特點 當待排記錄基本有序是,氣泡排序是不錯的選擇 但由於氣泡...
排序演算法總結
1 選擇排序 選擇排序的思想是依次從待排序數列中選擇最大 小 的 第二大 小 的等等,然後依次重新排列為有序數列。void selectionsort int a,int n if min i 時間複雜度o n 2 2 歸併排序 void merge int a,int left,int mid,i...
排序演算法總結
學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是 o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...