常考排序演算法

2021-08-07 07:49:29 字數 3091 閱讀 9722

演算法思想:

氣泡排序與快速排序屬於互換類的排序方法。氣泡排序是通過相鄰資料元素的交換逐步將線性表變成有序。基本過程為:

首先,從表頭開始掃瞄線性表,在掃瞄的過程中逐次比較相鄰兩個元素的大小。若前面元素大於後面元素,則將它們互換消去乙個逆序。

然後,從後到前掃瞄剩下的線性表,同樣在掃瞄過程中比較兩個元素的大小,若相鄰兩個元素中,後面的元素小於前面的元素,則將它們互換,這樣又消去乙個逆序。

對剩下的線性表重複上述的過程,直到剩下的線性表變為空為止,此時的線性表已經變為有序。

**:

template

void bub(t p, int n)

j = k + 1; k = 0;

for (i = m; i >= j;i--) //從後往前掃瞄

if (p[i-1]>p[i]) //順序不對交換

}return;

}

演算法思想:

從線性表中選取乙個元素,設為t,對線性表進行分割,將線性表後面小於t的元素移到前面,而前面大於t的元素移動到後面,結果就將線性表分割為兩部分。具體過程為:

首先在表的第乙個、中間乙個與最後乙個元素中選取中項,設為p(k),並將p(k)賦給t,再將表中的第乙個元素移到p(k)的位置上。

然後設定兩個指標i和j分別指向表的起始與最後的位置。反覆作以下兩步:

(1)將j逐漸增大,並逐次比較p(j)與t,直到發現乙個p(j)小於t為止,將p(j)移到p(i)的位置上。

(2)將i逐漸增大,並逐次比較p(i)與t,直到發現乙個p(i)大於t為止,將p(i)移到p(j)的位置上。

上述兩個操作交替進行,直到指標i與j指向同乙個位置(即i=j)為止,此時將t移動到p(i)的位置上。

**:

#include "bub.h"

template

void qck(t p, int n)

else

return;

}//表的分割

template

static

int split(t p, int n)}}

p[i] = t;

return i;

}

演算法思想:

所謂插入排序是指將無序序列中的各元素一次插入到已經有序的線性表中。

首先將第j個元素放到乙個變數t中,然後從有序字表的最後乙個元素開始,往前逐個與t進行比較,將大於t的元素均依次向後移動乙個位置,直到發現乙個元素不大於t為止,此時就將t插入到剛移出的空位置上,有序表的長度就變為j了。這種排序方法的效率與氣泡排序法相同,最壞的情況下,簡單插入排序需要n(n-1)/2次比較。

**:

template

void insort(t p, int n)

p[k + 1] = t;

}return;

}

演算法思想:

希爾排序(shell sort)屬於插入類排序,將整個無序序列分割成若干小的子串行分別進行插入排序。

子串行的分割方法如下:

將相隔某個增量h的元素構成乙個子串行。在排序過程中,逐次減小這個增量,最後當h減到1時,進行一次插入排序,排序就完成。

增量序列一般取

希爾排序的示意圖:

}演算法思想:

對於長度為n的序列,選擇排序需要掃瞄n-1遍,每一遍掃瞄均從剩下的字表中選出最小的元素,然後將該最小的元素與子表中的第乙個元素進行交換。選擇排序最壞情況下需要比較n(n-1)/2次。

**:

template

void select(t p, int n)

}return;

}

演算法思想:

堆排序屬於選擇類的排序方法。

堆的定義:

具有n個元素的序列

根據堆的定義,可以得到堆排序的方法如下:

(1)首先將乙個無序序列建成堆。

(2)然後將堆頂元素(序列中最大項)與堆中最後乙個元素交換(最大項應該在序列的最後)。不考慮已經換到最後的那個元素,只考慮前n-1個元素構成的子串行,顯然,該子串行已不是堆,但左右子樹仍然為堆,可以將該子串行調整為堆。反覆做第(2)步,直到剩下的子串行為空為止。

對於大規模的線性表來說是很有效的,堆排序需要比較的次數為。

**:

template

void hap(t p, int n)

return;

}template

static sift(t p, int i, int n)

else

}p[i] = t;

return

0;}

所謂歸併排序(merge sort)是指把乙個長度為n的線性表看成是由n個長度為1的有序表組成,然後反覆進行兩兩歸併,最後就得到長度為n的有序線性表。由於歸併是兩兩進行的,因此也稱為2-路歸併排序。

歸併排序的演算法又遞迴和非遞迴兩種形式。非遞迴演算法如下

template

static int merg(t p, int low, int

mid, int high, t a)

else

k = k + 1;

}if (i <= mid)

for (j = i; j <= mid; j++)

else

if (j <= high)

for (i = j; i <= high; i++)

for (i = low; i <= high; i++)

return 0;

}template

void merge(t p, int n)

m = k;

}delete a;

return;

}

reference:

面試常考 排序演算法總結

排序在各次面試的過程中問道的次數不少,氣泡排序和快速排序尤多。因此做一些總結,尤其是 部分。1.氣泡排序 1 思想 在一組數中,對當前未排好序的數,自上而下地對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的數往上冒。2 複雜度 平均情況 o n 2 最壞情況 o n 2 逆序有序 最好情況...

面試常考各類排序演算法總結 c

面試以及考試過程中必會出現一道排序演算法面試題,為了加深對排序演算法的理解,在此我對各種排序演算法做個總結歸納。1.1 演算法描述 1 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。2 對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。3 針對...

面試常考各類排序演算法總結 c

面試以及考試過程中必會出現一道排序演算法面試題,為了加深對排序演算法的理解,在此我對各種排序演算法做個總結歸納。1.1 演算法描述 1 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。2 對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。3 針對...