幾種常見的排序演算法及它們之間的比較

2021-08-10 20:56:36 字數 2608 閱讀 7189

1.穩定性比較

插入排序、氣泡排序、二叉樹排序、二路歸併排序及其他線形排序是穩定的

選擇排序、希爾排序、快速排序、堆排序是不穩定的

2.時間複雜性比較

插入排序、氣泡排序、選擇排序的時間複雜性為o(n2)

其它非線形排序的時間複雜性為o(nlog2n)

線形排序的時間複雜性為o(n);

3.輔助空間的比較

線形排序、二路歸併排序的輔助空間為o(n),其它排序的輔助空間為o(1);

4.其它比較

插入、氣泡排序的速度較慢,但參加排序的序列區域性或整體有序時,這種排序能達到較快的速度。

反而在這種情況下,快速排序反而慢了。

當n較小時,對穩定性不作要求時宜用選擇排序,對穩定性有要求時宜用插入或氣泡排序。

若待排序的記錄的關鍵字在乙個明顯有限範圍內時,且空間允許是用桶排序。

當n較大時,關鍵字元素比較隨機,對穩定性沒要求宜用快速排序。

當n較大時,關鍵字元素可能出現本身是有序的,對穩定性有要求時,空間允許的情況下。

宜用歸併排序。

當n較大時,關鍵字元素可能出現本身是有序的,對穩定性沒有要求時宜用堆排序。

下面是各種排序的具體**:

1.插入排序

void insert(int *a,int

n)

a[j+1]=temp; /*

插入*/

}

}

2.氣泡排序(1)

其原理為從a[0]開始,依次將其和後面的元素比較,若a[0]>a[i],則交換它們,一直比較到a[n]。

同理對a[1],a[2],...a[n-1]處理,即完成排序。 

void bubble(int *a,int

n)

} }

}

3.氣泡排序(2)

冒泡法還有第二種形式,或者叫沉底法也行:

每相鄰的兩個數進行比較,如果發現b[j]>b[j+1],則將b[j]向後移,最終是每次迴圈都把最大的數移到最後面

void bubble(int *b,int

n)

} }

}

4.選擇排序

選擇法迴圈過程與冒泡法1一致,它還定義了記號k=i,然後依次把a[k]同後面元素比較,若a[k]>a[j],則使k=j.

最後看看k=i是否還成立,不成立則交換a[k],a[i],這樣就比冒泡法省下許多無用的交換,提高了效率。 

void choise(int *a,int

n)

if(i!=min) /*

當min!=i是才交換,否則a[i]即為最小

*/

}

}

5.快速排序

快速法定義了三個引數,(陣列首位址*a,要排序陣列起始元素下標i,要排序陣列結束元素下標j).

它首先選乙個陣列元素(一般為a[ (i+j)/2 ],即中間元素)作為參照,把比它小的元素放到它的左邊,比它大的放在右邊。

然後運用遞迴,在將它左,右兩個子陣列排序,最後完成整個陣列的排序。

void quick(int *a,int i,int

j)

} while(m<=n);

if(m

quick(a,m,j);

/*運用遞迴

*/if(n>i)

quick(a,i,n);

}

6.「shell法」

shell法是乙個叫 shell 的美國人與2023年發明的。

它首先把相距k(k>=1)的那幾個元素排好序,再縮小k值(一般取其一半),再排序,直到k=1時完成排序。

void shell(int *a,int

n)

a[j+k]=x;

}

k/=2; /*

縮小間距值

*/}

}

7.二分排序

1.二分插入排序的基本思想和插入排序一致;都是將某個元素插入到已經有序的序列的正確的位置;

2.和直接插入排序的最大區別是,元素a[i]的位置的方法不一樣;直接插入排序是從a[i-1]往前乙個個比較,從而找到正確的位置;而二分插入排序,利用前i-1個元素已經是有序的特點結合二分查詢的特點,找到正確的位置,從而將a[i]插入,並保持新的序列依舊有序;

3.時間複雜度:

t(n) = o(n);

void sort(int

a)

else

}for(int j = i-1;j>=low;j--)

a[low] =key;

}

}

幾種常見的排序演算法及實現(一)

1 選擇排序 基本原理 對於給定的一組記錄,經過第一輪比較後得到最小的記錄,然後將該記錄與第乙個記錄的位置進行交換 接著對不包含第乙個記錄以外的其他記錄進行第二輪比較,得到最小的記錄並與第二個記錄進行位置交換 重複該過程,直到進行比較的記錄只有乙個時為止。void selectsort int a,...

幾種常見的排序演算法

氣泡排序演算法的運作如下 1 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。2 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。3 針對所有的元素重複以上的步驟,除了最後乙個。4 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要...

幾種常見的排序演算法

1.氣泡排序 void bubble sort int array,int n if 1 flag break printf d i return 2.快速排序 好 void quicksort int a,int left,int right left是選擇的軸點,如0,表示這個資料為軸點,rig...