排序方法比較

2021-06-08 23:02:07 字數 2731 閱讀 8831

根據排序的原則,內排序可以分為:

預備知識:

1.等差數列之和:s=n*(a1+an)/2

等比數列之和:s=a1(1-q^n)/(1-q)

2.使用哨兵提高效率

比如基本的順序查詢我們可以這樣做:

int search(int a,int n,int key){

for(int i=0;iif(a[i]==key)

return i+1;         //返回第幾個,而不是返回下標

return 0;                       //返回0說明沒有找到

注意到每次for迴圈都對邊界進行檢查(iint search(int a,int n,int key){

a[0]=key;

for(int i=n;a[i]!=key;i--);

return i;

但是使用哨兵的前提是在陣列中a[1]--a[n]儲存的是實際的元素,a[0]是拿來做哨兵的,即a的長度是n+1.

3.time()返回從2023年1月1日到現在的秒數,是實際時間。

clock返回開啟程序和呼叫clock()之間的的cpu時鐘計時單元(clock tick)數,不包括顯式呼叫sleep()的時間,常用來測試任務執行的速度。

插入排序

簡單插入排序

非常的簡單,想想你玩牌的時候一邊起牌,一邊就把牌排好序了,那就是插入排序.

時間複雜度:o(n^2),1+2+...+(n-1)=n^2/2。這是最壞的情況,其實大致上說插入排序的平均情況和最壞情況一樣差。

空間上來講,任一時刻最多只有乙個數字在儲存陣列之外,屬於原地排序,o(1)。

穩定的排序.

希爾排序

希爾排序利用利用了插入排序的兩個特點:

謝爾排序的時間複雜度在o(nlogn)和o(n^2)之間,空間複雜度為o(1).

為了使集合基本有序,而不是區域性有序,不能簡單地逐段分割,而應將相距為某個」增量」的元素組成乙個子串行.通常取增量為d1=n/2,di+1=di/2.

交換排序

氣泡排序

把待排序的序列分為有序區和無序區,每次把無序區最大的數放到無序區的最後面,這樣無序區的末元素成為有序區的首元素.

時間複雜度為o(n^2),空間複雜度o(1).

快速排序

快速排序是對氣泡排序的改進,由於氣泡排序是不斷比較相鄰元素然後進行交換,需要比較移動多次才能到達最終位置.而快速排序的比較和移動是從兩端向中間進行,因而元素移動的距離較遠.

初始主軸的選取採用三元取中法.經過n趟排序,當元素已基本有序後採用直接插入排序法.

理想情況下,每次劃分左右兩側的序列長度是相同的,長度為n的序列可劃分為logn層.定位乙個元素要對整個序列掃瞄一遍,所需時間為o(n),總的時間複雜度為o(nlogn).

如果每次都取最左邊的元素作主軸,最壞情況下待排序列完全有序(正序或逆序),每次劃分只得到比上一次少乙個的子串行,總的比較次數為1+2+3+...+(n-1)=o(n^2).

平均來說快速排序的時間複雜度為o(nlogn),棧的深度為o(logn).

快速排序是一種不穩定的排序演算法.

選擇排序

簡單選擇排序

簡單選擇排序和氣泡排序很像,每趟排序把把無序序列中最小的元素放到有序列的最後面,有序序列在前,無序序列在後.但有乙個重要的區別:氣泡排序在一趟排序中邊比較,邊交換;而簡單選擇排序在一趟排序中只作一次交換.

簡單選擇排序是穩定的,時間複雜度為o(n^2),空間複雜度為o(1).

堆排序

堆排序是對簡單選擇排序的改進,在簡單選擇排序中前一次的比較結果沒有儲存下來,後一趟排序中反覆對以前已經做過的比較重新做了一遍.

時間複雜度為o(nlogn),不穩定的排序.

歸併排序

二路歸併(用記憶體太多了,不用了。)

總結排序方法

平均情況

最好情況

最壞情況

輔助空間

穩定性

直接插入

o(n^2)

o(n)

o(n^2)

o(1)是希爾

o(nlogn)~o(n^2)

o(n^1.3)

o(n^2)

o(1)否冒泡

o(n^2)

o(n)

o(n^2)

o(1)是快速

o(nlogn)

o(nlogn)

o(n^2)

o(nlogn)~o(n)

否簡單選擇

o(n^2)

o(n^2)

o(n^2)

o(1)

是堆排序

o(nlogn)

o(nlogn)

o(nlogn)

o(1)否歸併

o(nlogn)

o(nlogn)

o(nlogn)

o(n)

是注:氣泡排序採用pos來標記已有序的序列位置後,最好情況才是o(n),如果沒有採用此改進演算法,最好情況也是o(n^2).我們的快速排序每次都把主軸放在vec[0]中,沒用另外使用單獨的變數,所以輔助空間為o(1),否則就是o(nlogn)~o(n).

比較排序的方法

排序的演算法主要有兩種 比較排序與非比較排序 比較排序,時間複雜度o nlogn o n 2 主要有 氣泡排序,選擇排序,插入排序,歸併排序,堆排序,快速排序等。非比較排序,時間複雜度可以達到o n 主要有 計數排序,基數排序,桶排序等。本文主要講解比較排序中的氣泡排序 選擇排序 插入排序 1 氣泡...

Java幾種排序方法比較

package com.sort public class sort public int partition int a,int low,int high swap a,low,p pos return p pos public void quicksort int a,int low,int h...

各種排序方法的比較

簡單排序包括直接插入排序 氣泡排序 和簡單選擇排序。排序方法的穩定性 假設ki kj 1 i n,1 j n,i j 若在排序前的序列中ri領先於rj 即i 證明一種排序方法是穩定的,要從演算法本身的步驟中加以證明。證明排序方法是不穩定的,只需給出乙個反例說明。1 簡單排序法一般只用於n比較小的情況...