前言:
作為乙個畢業季的狗子,在已經到來的秋招面前可謂是瑟瑟發抖。在海投簡歷的過程中,一次又一次的筆試,一次又一次的涼涼早就見怪不怪了。但是排序演算法出現的頻率真的比較大,所有現在做乙個學習及總結,應對接下來的筆試和面試(^ v ^)
首先來乙個總的介紹,基本排序演算法到底有哪些,不說了,直接上圖:
總結一下:
平均複雜度來分:
快排,堆排,歸併是最好的為o(nlog2n),
其次是插入,選擇,冒泡較差o(n^2)
計數排序和桶排序一樣為o(n+k)
其中快排的最好複雜度為o(nlog2n),最壞為o(n^2),
按穩定性分:
插入,冒泡,歸併,計數排序,桶排序,基數排序是穩定的,
選擇,快排,堆排,希爾排序不是穩定的
那麼如何區分穩定與不穩定?
穩定:如果a=b,排序前順序為a b, 排序後仍然為 a b
不穩定:如果a=b,排序前順序為a b,排序後變成 b a
下面將手撕這幾個演算法,嘿嘿嘿^ v ^
先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,具體演算法描述:
選擇乙個增量序列t1,t2,…,tk,其中ti>tj,tk=1;
按增量序列個數k,對序列進行k 趟排序;
每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m 的子串行,分別對各子表進行直接插入排序。僅增量因子為1 時,整個序列作為乙個表來處理,表長度即為整個序列的長度。
function shellsort(arr)
arr[j] = current;
}}return arr;
}
public class main ;
int low = 0;
int high = arr.length-1;
system.out.println("快排演算法");
system.out.println("排序之前");
for (int i:arr)
quiksort(arr,low,high);
system.out.println("排序之後");
for (int i:arr)
}public static void quiksort(int arr,int low,int high)
//標記
int i = low;
int j = high;
int key = arr[low];
while(i=key)
while (i
int temp = arr[i];
arr[i] = arr[j];
arr[j]=temp;
}int temp = arr[i];
arr[i]=arr[low];
arr[low]=temp;
quiksort(arr,low,i-1);
quiksort(arr,i+1,high);
}
排序演算法合集
每次排序將排序範圍內最小的值調換位置到最前面.雙指標的應用 include include using namespace std void bubblesort vector s int main bubblesort s for int i 0 i int s.size i cout 優化 當待...
排序演算法合集(Java)
public static void bubblesort int a 氣泡排序的時間複雜度為o n 2 是穩定的演算法 2.快速排序 public static void quicksort int a,int l,int r a i x quicksort a,l,i 1 quicksort a...
經典DP合集
1.數字三角形 數塔問題 dp入門題 有形如下圖所示的數塔,從頂部出發,在每一結點可以選擇向左走或是向右走,一起走到底層,要求找出一條路徑,使路徑上的值最大。樣例輸入 11 8 12 7 26 6 14 15 8 12 7 13 24 11 樣例輸出 86 13 8 26 15 24 狀態轉移方程 ...