排序演算法 整理歸檔

2021-06-26 00:54:51 字數 3296 閱讀 9331

我覺的冒泡什麼的就不說了,只是會提一下。

穩定性的定義:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,ri=rj,且ri在rj之前,而在排序後的序列中,ri仍在rj之前,則稱這種排序演算法是穩定的;否則稱為不穩定的。

簡單理解就是,對於相同的元素,不能因為排序,而改變他們的相對位置,不然就肯定做了無用功了(相對而言)。

1、插入排序-直接插入排序

是乙個穩定的演算法,不會改變相同元素的相對位置。複雜度 o(n)

2、插入排序-希爾排序

是乙個修改的氣泡排序,首先將所有元素分成d組,然後組內進行插入排序,然後將d進行減小,分的組會越來越多,最後d=1時就基本有序了。不穩定

void shellinsertsort(int a, int n, int dk)  

}

3、選擇排序-直接選擇排序

是將乙個剩下的所有元素中選擇乙個最小的與第乙個交換,重複這個過程,我一直覺得這個和氣泡排序很像,存在不相鄰元素的互換。不穩定

4、選擇排序-堆排序,是對直接選擇排序的改進。

堆排序是乙個樹形結構,堆對應乙個完全二叉樹。

(1)ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n/2),小頂堆,完全二叉樹。堆排序是乙個不穩定的算演算法

由於建初始堆所需的比較次數較多,所以堆排序不適宜於記錄數較少的檔案。

堆排序是就地排序,輔助空間為o(1)

/** 

* 已知h[s…m]除了h[s] 外均滿足堆的定義

* 調整h[s],使其成為大頂堆.即將對第s個結點為根的子樹篩選,

* * @param h是待調整的堆陣列

* @param s是待調整的陣列元素的位置

* @param length是陣列的長度

* */

void heapadjust(int h,int s, int length)

/**

* 堆排序演算法

*/ void heapsort(int h,int length)

}

5、氣泡排序

是最簡單的,就是乙個乙個往上移動,最壞時間n^2,最好n,平均是o(n^2),是乙個穩定演算法

6、快排

快排是不穩定的,從他的原理就可以看出來,需要進行交換。

遞迴的

void swap(int *a, int *b)  

int partition(int a, int low, int high)

print(a,10);

return low;

}

void quicksort(int a, int low, int high)

}

另外乙個面試經常考的演算法出來了,歸併排序

7、歸併排序

歸併排序是穩定的排序演算法,主要是因為歸併排序不存在將相同元素變換相對位置的操作。

//將r[i…m]和r[m +1 …n]歸併到輔助陣列rf[i…n]  

void merge(elemtype *r,elemtype *rf, int i, int m, int n)

while(i <= m) rf[k++] = r[i++];

while(j <= n) rf[k++] = r[j++];

}

merge是公有的,至於是遞迴去實現還是利用堆疊,是另外乙個函式所做的事情。

void msort(elemtype *r, elemtype *rf,int s, int t)  

}

這乙個歸併排序是,單路的,主要原理是從0序列開始,先歸併1個元素,然後歸併2個元素,4,8。。。

void mergesort(elemtype *r, elemtype *rf, int lenght)

{

int len = 1;

elemtype *q = r ;

elemtype *tmp ;

while(len < lenght) {

int s = len;

len = 2 * s ;

int i = 0;

while(i+ len

記住,快排和歸併,都是遞迴的實現最簡單。

8、桶排序/基數排序桶排序是穩定的

把資料分組,放在乙個個的桶中,然後對每個桶裡面的在進行排序。

例如要對大小為[1..1000]範圍內的n個整數a[1..n]排序

首先,可以把桶設為大小為10的範圍,具體而言,設集合b[1]儲存[1..10]的整數,集合b[2]儲存 (10..20]的整數,……集合b[i]儲存( (i-1)*10, i*10]的整數,i = 1,2,..100。總共有 100個桶。

然後,對a[1..n]從頭到尾掃瞄一遍,把每個a[i]放入對應的桶b[j]中。 再對這100個桶中每個桶裡的數字排序,這時可用冒泡,選擇,乃至快排,一般來說任 何排序法都可以。

缺點也很明顯

1、空間複雜度

2、要求,資料必須要在一定範圍內

基數排序,可以想一下撲克牌,先根據花色進行排序,然後根據數字,是穩定的

基數排序過程無須比較關鍵字,而是通過「分配」和「收集」過程來實現排序。它們的時間複雜度可達到線性階:o(n)。

總的比較

分為兩種,一種是高位優先msd,一種是低位優先lsd。

排序類別

時間空間

穩定插入   

o(n^2)1√

希爾o(n^2)1×

冒泡o(n^2)1√

選擇o(n^2)1×

快速o(nlogn)

o(nlogn)

×堆排序

o(nlogn)1×

歸併排序

o(nlogn)

o(n)

排序 排序演算法整理

經常零零散散的用到排序演算法,將幾類常見的總結下來 時間複雜度o n 2 空間複雜度o 1 穩定排序 param arr public static void insersort int arr else arr j 1 tmp 氣泡排序 時間複雜度 o n 2 空間複雜度o 1 穩定排序 para...

排序演算法整理

template void cinsertsort mysort function compare template void cselectsort mysort function compare swap datas i datas id void cshellsort mysort funct...

排序演算法整理

先把常用排序演算法進行分類 插入排序 直接插入排序 折半插入排序 希爾排序 交換排序 氣泡排序 快速排序 選擇排序 簡單選擇排序 堆排序 歸併排序 基數排序 下面我們乙個乙個來看 1.直接插入排序 進行n 1趟排序,每趟把乙個元素插入到前面已經排好序的序列中,其時間複雜度為o n 並且由於判斷要插入...