常用排序演算法整合(一)(插入 希爾 冒泡 快排)

2021-10-24 09:49:40 字數 1991 閱讀 3557

折半插入排序

希爾排序

氣泡排序

快速排序

參考時間複雜度: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

2​n)

快速排序是遞迴的,執行行時需要有乙個棧來存放相應的資料。最大遞迴呼叫次數與遞迴樹的 深度一致,所以最好情況下的空間複雜度為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的位...