根據排序的原則,內排序可以分為:
預備知識:
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比較小的情況...