排序演算法之內排序總結

2021-07-29 05:42:04 字數 2279 閱讀 7279

1插入排序

template

void inssort(e a,int n)

最差情況下:總比較次數是θ(n^2);

最佳情況下:總比較次數是θ(n);

平均執行時間n*n/4,即θ(n^2);

總排序次數即總比較次數-(n-1);

2氣泡排序

從記錄陣列的底部比較到頂部,比較相鄰關鍵碼值。如果低序號的關鍵碼值比高序號的關鍵碼值大,則將二者交換順序。每一輪迴圈都是比較相鄰關鍵碼值,但是都將比上一輪迴圈少乙個關鍵碼。

template

void bubsort(e a,int n)

最佳,平均,最差情況的執行時間幾乎相同,均為θ(n*n);

3選擇排序

從未排序的序列中找到最小關鍵碼值,接著是次小關鍵碼值,以此類推,獨特之處在於交換操作很少。

本質上是氣泡排序。通過選擇最小元素的位置,一次交換到位,而不是不斷交換相鄰記錄。

template

void selsort(e a,int n)

}

以上三種均屬於交換排序,關鍵的瓶頸是只交換相鄰元素,因此,比較和移動只能一步步地進行(除選擇排序外)。任何一種交換排序地時間代價都是陣列中所有記錄移動到正確地位置所需要地總步數。

4shell排序

又名縮小增量排序。在不相鄰地記錄之間進行比較與交換,利用了插入排序地最佳時間代價特性。

把序列分成多個子串行,然後分別對子序列進行排序,最後把子序列組合起來。

template

void inssort2(e a,int n,int incr)

template

void shellsort(e a,int n)

好的增量序列的共同特徵:

① 最後乙個增量必須為1

② 應該盡量避免序列中的值(尤其是相鄰的值)互為倍數的情況

5歸併排序

思想不難理解,無非是分分分分到底再乙個個合起來。

template

void mergesort(e a,e temp,int

left,int

right)

int i,j,k,mid=(left+right)/2;

mergesort(a,temp,left,mid);

mergesort(a,temp,mid+1,right);

for(i=mid;i>=left;i--)temp[i]=a[i];

for(j=1;j<=right-mid;j++)temp[right-j+1]=a[j+mid];

for(i=left,j=right,k=left;k<=right;k++)

if(comp::prior(temp[i],temp[j]))a[k]=temp[i++];

else a[k]=temp[j--];

}

歸併排序最佳,平均,最差執行時間都是θ(n*log(n)),不依賴於待排序陣列中數值地相對順序。

6快速排序

較之歸併排序,快速排序無需額外的陣列空間;

template

void qsort(e a,int i,int j)

inline

int findpivot(e a,int i,int j)

inline

int partition(e a,int l,int r,e& pivot)

快速排序首先選擇乙個軸值,對陣列進行劃分,partition函式的執行過程就是快速劃分的實現過程。每一輪迴圈,從左邊找第乙個比軸值大的數,返回下標l,從右邊找第乙個比軸值小的數,返回下標r,swapa[l]和a[r];直到l和r相遇,即完成兩邊劃分,再遞迴快排分別對兩邊進行排序。

最差情況下,每個軸值都未能把陣列劃分好,陣列中記錄隨機,時間代價為θ(n*n);

最佳情況下,每個軸值都把陣列分成相等的兩部分,時間代價是θ(n*log(n));

平均情況下,θ(n*log(n));

7分配排序

templatevoid binsort(e a,int n)
時間代價為θ(n);每個盒子只有乙個關鍵碼,關鍵碼可重複。

8基數排序

template

void radix(e a,e b,int n,int k,int r,int cnt)

}

資料結構之內部排序演算法總結筆記

內部排序演算法 排序的基本概念 把一組無序的資料元素按照關鍵字值遞增 或遞減 的順序重新排列。一 插入排序 思想 將序列分為 有序段 與 無序段 兩段,然後依次將 無序段 中的元素插入到 有序段 的正確位置。尋找元素應插入的位置可用 直接 和 折半 兩種方式進行查詢。對應演算法 直接插入排序 折半插...

排序演算法總結(快速排序)

終於不用改 了,希望文章大修順利!穩定的演算法 不穩定的演算法 內部排序 排序過程不涉及內 外存交換 外部排序 排序過程有內 外存交換 in place sort 不占用額外記憶體或占用常數的記憶體 插入排序 選擇排序 氣泡排序 堆排序 快速排序。out place sort 歸併排序 計數排序 基...

排序演算法(內部排序)總結

排序是計算機應用中的乙個非常重要的操作。平常我們總會聽到一些演算法,但是我們總是似懂非懂的寫著 今天我將一般常見的排序演算法進行乙個總結。本次總結只涉及內部排序 所謂內部排序是指在記憶體中進行的排序 首先說乙個概念 穩定排序與非穩定排序 如果乙個序列中原來相同的元素,排序完成後,仍然保持著原來的順序...