std中穩定排序演算法 八大經典排序演算法

2021-10-18 17:30:35 字數 2677 閱讀 5165

一、插入排序-直接插入排序(straight insertion sort)

直接插入排序(straight insertion sort)的基本思想是:把n個待排序的元素看成為乙個有序表和乙個無序表。開始時有序表中只包含1個元素,無序表中包含有n-1個元素,排序過程中每次從無序表中取出第乙個元素,將它插入到有序表中的適當位置,使之成為新的有序表,重複n-1次可完成排序過程。

#include

using namespacestd;void insertsort(int *a,intn)

intmain()

;insertsort(a,8);for(int i=0;i<8;i++)

printf("%d%c",a[i],i==7?'\n':' ');return 0;

二、插入排序-希爾排序(shell's sort)

如-3,-1,-5,-7,-2,-4,-9,-6

第一次分組k=8/2=4,分為四組(-3,-2)(-1,-4)(-5,-9)(-7,-6)排序後為-3,-4,-9,-7,-2,-1,-5,-6;第二次k=4/2=2

分為兩組(隔二取一)(-3,-9,-2,-5)(-4,-7,-1,-6)

-9,-7,-5,-6,-3,-4,-2,-1

第二次 k=1,整體為一組,直接插序。

#include

using namespacestd;void shellsort(int *a,intn)

intmain()

;shellsort(a,8);for(int i=0;i<8;i++)

printf("%d%c",a[i],i==7?'\n':' ');return 0;

三、選擇排序-簡單選擇排序(****** selection sort)

選則排序,和插入排序不同的是,每次從陣列中選擇乙個最小的數,放到前面,因此就是n次迴圈o(n^2)

void selectionsort(int *a,intn)

intmain()

;selectionsort(a,8);for(int i=0;i<8;i++)

printf("%d%c",a[i],i==7?'\n':' ');return 0;

上面的選擇排序,每次確定乙個最小值,迴圈n次,也可以二元選擇,每次確定乙個最大值,乙個最小值,因此可以減少迴圈。

//二元選擇排序

#include

using namespacestd;void selectionsort_twopoint(int *a,intn)

if(mink==n-i-1 && maxk==i) swap(a[i],a[n-i-1]);//避免二次交換

else if(maxk==i) swap(a[n-i-1],a[i]),swap(a[i],a[mink]);else swap(a[i],a[mink]),swap(a[maxk],a[n-i-1]);

}intmain()

;selectionsort_twopoint(a,8);for(int i=0;i<8;i++)

printf("%d%c",a[i],i==7?'\n':' ');return 0;

四、選擇排序-堆排序(heap sort)

什麼是堆(heap):

(1)堆中某個節點的值總是不大於或不小於其父節點的值;

(2)堆總是一顆完全二叉樹(complete binary tree)

完全二叉樹是由滿二叉樹(full binary tree)而引出來的。除最後一層無任何子節點外,每一層上的所有結點都有兩個子結點的二叉樹稱為滿二叉樹。

如果除最後一層外,每一層上的節點數均達到最大值;在最後一層上只缺少右邊的若干結點,這樣的二叉樹被稱為完全二叉樹。

一棵完全二叉樹,如果某個節點的值總是不小於其父節點的值,則根節點的關鍵字是所有節點關鍵字中最小的,稱為小根堆(小頂堆);如果某個節點的值總是不大於其父節點的值,則根節點的關鍵字是所有節點關鍵字中最大的,稱為大根堆(大頂堆)。

若乙個數列滿足

堆排序的核心是建樹,任何乙個樹的父節點的個數為n/2,設父節點的標號為u,則左兒子的標號為2*u,右兒子的標號為2*u+1;

建樹的核心為從父節點所在的最底層開始建樹,每次比較父節點,左兒子和右兒子的元素大小,把最大最小的元素放到父節點的位置上(左兒子和右兒子的相對大小不做要求),若父節點的元素已經為最大(或最小),則繼續向上建樹,否則,交換元素後向下回溯。(建樹從下往上,回溯從上往下)

以0,-1,-5,-7,-2,-4,-9,-3為例:

元素的個數為8,所以有4個父節點。

建樹完成後,1節點為最大值,交換到陣列最後,之後維護前面的數,調整二叉樹,直到排序完成。

**實現:

#include

using namespacestd;void heapadjust(int *a,int u,intn)

{int lson=2*u,rson=2*u+1,maxelement=u;if(u<=n/2)

{if(lson<=n && a[maxelement]

八大經典排序 C 實現

所謂 氣泡排序 可以從名稱上理解 以從小到大來舉例,冒泡 實際上就是指把值更大的元素放到數列的後面 如果是從大到小排列,則反之 通過交換來實現。我們先來大致地看下面的 感受一下氣泡排序的執行過程 氣泡排序 includeusing namespace std void bubblesort int ...

std中穩定排序演算法 穩定排序演算法

常用排序演算法?穩定性 穩定排序演算法會讓原本有相等鍵值的紀錄維持相對次序。也就是如果乙個排序演算法是穩定的,當有兩個相等鍵值的紀錄r和s,且在原本的列表中r出現在s之前,在排序過的列表中r也將會是在s之前。氣泡排序演算法 比較相鄰的元素,按照順序進行交換,一次遍歷後,就會有乙個最大 最小 交換至頂...

經典演算法 八大排序演算法總結

插入排序 特點 stable sort in place sort,最好o n 最壞o n 2 氣泡排序 特點 stable sort in place sort 思想 通過兩兩交換,像水中的泡泡一樣,小的先冒出來,大的後冒出來。快速排序 改進當所有元素相同時的效率的partition實現 堆排序 ...