各種排序演算法總結

2021-06-26 15:33:18 字數 2624 閱讀 7359

1 插入排序

void

insertsort(int

a, int

n)a[j+1] =key;

}插入排序是穩定的排序,平均和最壞時間複雜度是o(n^2)。最好的時間複雜度是o(n),對應於全部排好序的情況。

2 氣泡排序

void

bubblesort(int

a, intn)}

}氣泡排序是穩定的排序,平均和最壞時間複雜度是o(n^2)。

3 選擇排序

每一趟從待排序的資料元素

中選出最小(或最大)的乙個元素,順序放在已排好序的數列的最後,直到全部待排序的資料元素排完。選擇排序

是不穩定的排序方法。

void

selectsort(int

a, intn)}

} 選擇排序是不穩定的,因為,在一趟選擇,如果當前元素比乙個元素小,而該小的元素又出現在乙個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。舉個例子,序列5 8 5 2 9,我們知道第一遍選擇第1個元素5會和2交換,那麼原序列中2個5的相對前後順序就被破壞了平均和最壞時間複雜度是o(n^2)。

4 希爾排序(縮小增量排序)

該方法的基本思想是:先將整個待排元素序列分割成若干個子串行(由相隔某個「增量」的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比前兩種方法有較大提高。

void

shellsort(int

a, int

n)a[k+gap] =temp;}}

}}}void

shellsortimproved(int

a, int

n)a[k+gap] =temp;}}

}希爾排序是不穩定的。由於多次插入排序,我們知道一次插入排序是穩定的,不會改變相同元素的相對順序,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,最後其穩定性就會被打亂,所以shell排序是不穩定的。使用希爾增量時,最壞執行時間是o(n^2),使用hibbard增量時,最壞執行時間是o(n^3/2)。

5. 堆排序

void

maxheapify1(int

a, int

n,int

i) else

return;

}void

maxheapify2(int

a, int

n,int

i)if (largest!=i) else

break;}}

void

heapsort(int

a,int

n)堆排序是原地排序,但是不是穩定排序。時間複雜度o(nlogn)。

6 歸併排序

void

merge(int

a,int

p, int

q, int

r)delete l;

delete r;

}void

mergesort(int

a, int

p,int

r)合併過程中我們可以保證如果兩個當前元素相等時,我們把處在前面的序列的元素儲存在結果序列的前面,這樣就保證了穩定性。所以,歸併排序也是穩定的排序演算法。時間複雜度是o(nlogn)。可以

在空間複雜度

o(1)

的條件下實現歸併排序。

7. 快速排序

被快速排序所使用的空間,依照使用的版本而定。使用原地(in-place)分割槽的快速排序版本,在任何遞迴呼叫前,僅會使用固定的額外空間。然而,如果需要產生o(log n)巢狀遞迴呼叫,它需要在他們每乙個儲存乙個固定數量的資訊。因為最好的情況最多需要o(log n)次的巢狀遞迴呼叫,所以它需要o(log n)的空間。最壞情況下需要o(n)次巢狀遞迴呼叫,因此需要o(n)的空間。

void

median3(int

a,int

p, int

r)int

partition1(int

a, int

p, intr)}

swap(a[i+1],a[r]);

return

i+1;

}int

partition2(int

a, int

p, int

r)swap(a[i],a[r]);

returni;}

void

quicksort(int

a, int

p,int

r) 快速排序是不穩定的排序,最差時間複雜度是o(n^2),平均時間複雜度是o(nlogn)。

8. 桶排序

void

bucketsort(int

a, int

n)int

k = 0;

for (int

i=0; i

<1000; ++i)

}如果count有m個單元,演算法用時o(m+n),桶排序是穩定的排序。但是需要額外的空間。

穩定的排序有:冒泡,插入,歸併,基數,桶。

各種排序演算法總結

注 以下所講排序,以公升序排序為例!選擇排序 作者思路 在一組數中,選擇第乙個數標記為最小值,在剩下的數中找比它小的數,若找到則交換兩數,標記新的 最小值 然後繼續往下找,這樣一趟下來就可以找到一組數中第二小的值,第二次以第二個數作為最小值,如此迴圈下去。這是最簡單 最基礎的一種排序演算法。例子 1...

各種排序演算法總結

created by vencent on 2008.8.29 1.插入排序 1.1 一般插入排序 insertsort int array,int length 1.2 折半插入排序 bininsertsort int array,int length 1.3 希爾排序 shellsort int...

各種排序演算法總結

一 排序分類 內部排序 整個排序過程不需要訪問外存便能完成。外部排序 參加排序的記錄數量很大,整個序列的排序過程不可能在記憶體中完成。二 效能比較 排序方法 平均情況 最好情況 最壞情況 空間穩定性 冒泡o n2 o n o n2 o 1 穩定簡單選擇排序 o n2 o n2 o n2 o 1 不穩...