從第二個元素開始,每次選擇乙個元素插入到之前已經排好序的部分。
選擇插入位置的時候從後往前,將帶插入元素取出,依次後移大於帶插入元素的數。
演算法複雜度:
最好是正序有序,需要n次比較。
最差逆序有序,複雜度o(
n2)
平均複雜度o(
n2)
插入排序是穩定的
void insertsort(int a,int
size)
a[j+1] = tmp; //最後j位置數小於帶插入的數,在j+1位置插入數
}}
實際也是一組插入排序,只不過是分組插入排序。給定增量值d,將序列分為d個子序列,先插入排序子串行,最後對全部序列進行 一次插入排序。
也就是增量值必須取小於n的值,且最後乙個增量必須為1。
由於大於1的增量,排序是不穩定的。
平均複雜度:o(
nlog
n)
void shellsort(int a,int
size)
a[j+d] = tmp;
}d /= 2;
}}
對氣泡排序的一種改進,基於交換
演算法複雜度在最壞情況下為o(
n2) ,平均為o(
nlog
n)同時快排是不穩定的
void quicsort(int a,int low,int high)
a[i] = tmp;
quicksort(a,low,i-1);
quicksort(a,i+1,high);
}
排序不穩定
void selectsort(int a,int
size)
}if(k != i) swap(a[i],a[k]);
}}
在陣列中建堆
從最後乙個非葉節點進行調整
將堆頂元素與最後的元素交換,然後調整堆。
複雜度為:o(
nlog
n)
void heapadjust(int a,int i,int
size)
}void buildheap(int a,int
size)
}void heapsort(int a,int
size)
}
歸併排序是穩定排序,複雜度為o(
nlog
n),缺點是需要額外的o(
n)空間
void merge(int a, int tmp,int
left,int
mid, int
right)
else
}while (i <= mid) tmp[k++] = a[i++];
while (j <= right) tmp[k++] = a[j++];
for (int p = left; p <= right; p++)
}void m_sort(int a,int tmp,int
left,int
right)
void mergesort(int a, int size)
面試 排序演算法總結
空間複雜度 快速排序是一種原地排序,只需要乙個很小的棧作為輔助空間,空間複雜度為o log2n 所以適合在資料集比較大的時候使用。時間複雜度 時間複雜度比較複雜,最好的情況是o n 最差的情況是o n2 所以平時說的o nlogn 為其平均時間複雜度。具體操作過程 隨便取乙個值 6 將其為基準進行排...
面試排序演算法個人總結
總結了很久的排序演算法,自己測試了很多次,一直寫在筆記本上,還是怕弄丟了,還是貼到部落格上面來吧 氣泡排序 交換排序 氣泡排序 param arr public static void bubblesort long arr if exchange 0 插入排序 直接插入排序 param arr p...
面試常考 排序演算法總結
排序在各次面試的過程中問道的次數不少,氣泡排序和快速排序尤多。因此做一些總結,尤其是 部分。1.氣泡排序 1 思想 在一組數中,對當前未排好序的數,自上而下地對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的數往上冒。2 複雜度 平均情況 o n 2 最壞情況 o n 2 逆序有序 最好情況...