排序演算法總結

2021-08-20 13:59:13 字數 1834 閱讀 1412

這是對個人對於排序演算法回顧和複習,所以可能寫的很省略。如果之前沒有學過可以看看參考列的部落格。這篇部落格在秋招後會刪掉。寫的太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 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...