資料結構:排序(1)
王爭資料結構11筆記
1、氣泡排序、插入排序、選擇排序是基於比較的排序。時間複雜度為。
2、快排,歸併排序也是基於比較的排序。時間複雜度為
3、桶排序、計數排序、基數排序不是基於比較的排序,其時間複雜度為
4、氣泡排序BS:一次冒泡會讓至少一個元素移動它應該在的位置,重複n次之後就完成了n個數據的排序工作。
每次冒泡就是把從左至右的資料中第一個相鄰關係發生異常的資料擺放到正確的位置的過程,其餘的順序保持不變。當某一次冒泡操作已經沒有資料交換時,說明完全有序,不需要再執行後續冒泡操作。
void bubbleSort(int a[], int n){ if (n<=1) return; for(int i=0;i<n;++i){ //提前退出冒泡迴圈的標誌位 bool flag=false; for(int j=0;j<n-i-1;++j) { if(a[j]>a[j+1]){ int tmp=a[j]; a[j]=a[j+1]; a[j+1]=tmp; flag=true; } } if(!flag) break; } }
5、氣泡排序只涉及相鄰資料交換操作,常量級臨時空間,空間複雜度O(1),原地排序演算法。
相同大小的資料再排序前後順序不變,因此氣泡排序為穩定的排序演算法
時間複雜度計算:最好情況:一次冒泡,即O(n)。最壞情況:n次冒泡,即。平均情況下需要n*(n-1)/4的交換操作,平均情況下的時間複雜度為。
---------------------------------------------------------------------------分割線---------------------------------------------------------------------------
插入排序
6、將陣列中的資料分為兩個區間,已排序區間和未排序區間。初始已排序區間只有一個元素,就是陣列的第一個元素。插入演算法的核心思想是取未排序區間中的元素,在已排序區間中找到合適的插入位置將其插入並保證已排序區間資料抑制有序。
7、插入排序包括兩種操作,一種是元素比較,一種是元素移動。插入排序的移動次數等於逆序度。
void inserttionSort(int a [], int n) { if(n<=1) return; for (int i=1;i<n;++i) { int value=a[i]; int j=i-1; //查詢插入的位置 for(;j>=0;--j) { if(a[j]>value) { a[j+1]=a[j];//move } else { break; } } a[j+1]=value;//insert } } }
8、插入排序是原地排序演算法,空間複雜度為O(1);插入排序是穩定的排序演算法;插入排序的時間複雜度
---------------------------------------------------------------------------分割線---------------------------------------------------------------------------
選擇排序
9、選擇排序每次從未排序區間中找到最小的元素,將其放到已排序區域的末尾。
10、選擇排序的空間複雜度為O(1)。是一種原地排序演算法。
11、選擇排序的最好情況時間複雜度、最壞情況和平均情況時間複雜度為
12、選擇排序是一種不穩定的排序演算法,其每次都要找剩餘未排序元素中的最小值,並和前面的元素交換位置,這會破壞穩定性。
---------------------------------------------------------------------------分割線---------------------------------------------------------------------------
13、氣泡排序無論如何優化,元素交換的次數是原始資料的逆序度。插入排序同樣如此,不管怎麼優化,元素移動的次數等於原始資料的逆序。
14、氣泡排序的資料交換需要3個賦值操作,而插入排序只需1個。因此,如果希望把效能做到極致,應該首選插入排序。
15、三種排序方法的時間複雜度為。冒泡和選擇實戰中使用很少,插入排序較為使用。對於大規模資料排序問題,三種方法時間複雜度較高,更傾向於用的排序演算法。