我覺的冒泡什麼的就不說了,只是會提一下。
穩定性的定義:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,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 並且由於判斷要插入...