折半插入排序
希爾排序
氣泡排序
快速排序
參考時間複雜度:o(n
2)
o(n^2)
o(n2
);空間複雜度:o(1
)o(1)
o(1)
,穩定排序
void insertsort(vector& arr)
、\、\
、等五組,在組內插入排序,得到了第一趟排序的結果,
然後第二趟間隔為d2=
3d_2=3
d2=
3,全部記錄分成3組,組內插入排序得到第二次的結果
第三趟增量為d3=
1d_3=1
d3=
1,直接對整個序列插入排序,得到最終結果
void shellinsertsort(vector& arr,int dk)
}n--;
}}
最好情況下只需比較n−1
n-1n−
1次,無需移動元素
最壞情況下,需要n−1
n-1n−
1次冒泡,總的比較次數為n(n
−1)/
2≈n2
/2
n(n−1)
/2≈n
2/2,總的交換次數:3n(
n−1)
/2≈3
n2/2
3n(n−1
)/2≈
3n2/
2 所以平均情況下,比較次數和移動次數分別約為n2/
4,3n
2/
4n^2/4,3n^2/4
n2/4,3
n2/4
,故時間複雜度為o(n
2)
o(n^2)
o(n2)
空間複雜度為o(1
)o(1)
o(1)
氣泡排序是穩定排序
演算法平均時間效能由於移動元素次數多,所以比直接插入排序要差
快速排序是一種分而治之思想在排序演算法上的典型應用。本質上來看,快速排序應該算是在氣泡排序基礎上的遞迴分治法。
從序列中挑出乙個元素作為樞軸(通常取第乙個)
重新排序,所有比樞軸小的元素放在樞軸前面,所有元素比樞軸大的放在樞軸的後面(相同的數可以到任一邊)
遞迴地把小於樞軸元素的子串行和大於樞軸元素的子串行排序;
其中一次快排的操作如下:
選擇樞軸,設定兩個指標low和high分別指向序列的下界和上界
從序列最右側向左搜尋,找到第乙個小於樞軸的元素,將其移動到low處
然後從最左側向右搜尋第乙個大於樞軸的元素,將其移動到high處
重複2、3,直到low與high相等為止,此時low(或high)所在位置即為這次排序樞軸的最終位置,左右為兩個子串行
int paritition(vector& arr, int low, int high)
arr[low] = arr[high];
while (low < high && arr[low] <= pivot)
arr[high] = arr[low];
}arr[low] = pivot;
return low;
}void quicksort(vector& arr, int low, int high)
}
理論上可以證明,平均情況下,快速排序的時間複雜度為o(n
log2
n)
o(nlog_2n)
o(nlog
2n)
快速排序是遞迴的,執行行時需要有乙個棧來存放相應的資料。最大遞迴呼叫次數與遞迴樹的 深度一致,所以最好情況下的空間複雜度為o(l
og2n
)o(log_2n)
o(log2
n),最壞情況下為o(n
)o(n)
o(n)
快速排序是不穩定排序
嚴蔚敏 李冬梅 吳偉民 《資料結構(c語言版)(第二版)》
排序演算法 一 插入排序 直接插入排序 希爾排序
當插入第i i 1 個元素時,前面的array 0 array 1 array i 1 已經排好序,此時用array i 的排序碼與array i 1 array i 2 的排序碼順序進行比較,找到插入位置即將array i 插入,原來位置上的元素順序後移。最差時間複雜度 最壞情況為輸入序列是降序排...
排序演算法一之冒泡 選擇 插入 希爾排序
本文中的前三種排序都是公升序排序,又因為這三個排序的平均時間複雜度都是o n2 最差情況也都是o n2 另外這三種排序也是其他排序如快排 希爾排序的基礎,較少,思想較容易理解,所以放在一塊。對於排序的思想可以參考嚴蔚敏的 資料結構 的書,也可以參考 大話資料結構 或者另外一本 妙趣橫生的演算法 c語...
演算法 一 插入排序
插入排序演算法類似於玩撲克時抓牌的過程,玩家每拿到一張牌都要插入到手中已有的牌裡,使之從小到大排好序。撲克牌的插入排序 也許你沒有意識到,但其實你的思考過程是這樣的 現在抓到一張7,把它和手裡的牌從右到左依次比較,7比10小,應該再往左插,7比5大,好,就插這裡。為什麼比較了10和5就可以確定7的位...