演算法總結 一 排序演算法總結

2021-09-18 07:26:03 字數 4180 閱讀 4796

1.輸入:n個數,a1,a2,……,an

2.輸出:n個數,a1',a2',……,an',使得a1'≤a2'≤……≤an'。

1.in-place sort(不占用額外記憶體或占用常數記憶體):插入排序、選擇排序、氣泡排序、堆排序、快速排序;

out-place sort:歸併排序、計數排序、基數排序、桶排序。

2.穩定排序:插入排序、氣泡排序、歸併排序、基數排序、計數排序、桶排序;

不穩定排序:選擇排序、快速排序、堆排序。

穩定性:如果ai=aj,排序前ai在aj之前,排序後ai還在aj之前。

3.比較排序:氣泡排序、選擇排序、插入排序、歸併排序、堆排序、快速排序;

非比較排序:計數排序、基數排序、桶排序。

排序方法

平均情況

最好情況

最壞情況

輔助空間

穩定性氣泡排序

o(n^2)

o(n)

o(n^2)

o(1)

穩定簡單選擇排序

o(n^2)

o(n^2)

o(n^2)

o(1)

不穩定直接插入排序

o(n^2)

o(n)

o(n^2)

o(1)

穩定希爾排序

o(nlogn)—o(n^2)

o(n^2)

o(1)

不穩定堆排序

o(nlogn)

o(nlogn)

o(nlogn)

o(1)

不穩定歸併排序

o(nlogn)

o(nlogn)

o(nlogn)

o(n)

穩定快速排序

o(nlogn)

o(nlogn)

o(n^2)

o(logn)—o(n)

不穩定1.重複地走訪過要排序的元素,依次比較相鄰的兩個元素,如果他們的順序錯誤就把它們調換過來,知道沒有元素在需要交換,排序完成。

3.程式設計實現

//分類——內部比較排序

//資料結構——陣列

//最差時間複雜度——o(n^2)

//最優時間複雜度——o(n)

//平均時間複雜度——o(n^2)

//輔助空間——o(1)

//穩定性——穩定

public class bubblesort

public static void bubblesort(int a, int n)

}} }

}

4.氣泡排序改進——雞尾酒排序

(1)雞尾酒排序,也叫定向氣泡排序,與傳統的氣泡排序的區別在於從低到高比較然後從高到低比較。

(2)**實現

public class cocktailsort 

}right--;

for(int i = right; i > left; i--)

}left++;

} }}

1.初始時在序列中找到最小(大)元素,放到序列的起始位置作為已排序序列,然後再從剩餘未排序序列中繼續尋找最小(大)元素,以此類推。

3.**實現

//分類——內部比較排序

//資料結構——陣列

//最差時間複雜度——o(n^2)

//最優時間複雜度——o(n^2)

//平均時間複雜度——o(n^2)

//輔助空間——o(1)

//穩定性——不穩定

public class selectionsort

}if(min != i)

} }}

1.將未排序資料,在已排序序列中從後向前掃瞄,找到相應位置插入。

2.**實現:

//分類——內部比較排序

//資料結構——陣列

//最差時間複雜度——降序序列o(n^2)

//最優時間複雜度——公升序序列o(n)

//平均時間複雜度——o(n^2)

//輔助空間——o(1)

//穩定性——穩定

public class insertsort

a[j + 1] = get;

} new display();

display.display(a, n);

}}

3.插入排序的改進——二分插入排序

(1)**實現:

//最優時間複雜度——o(nlogn)

public class insertsortdichotomy

else

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

a[left] = get;

} new display();

display.display(a, n);

}}

4.插入排序的更高效改進——希爾排序

1.希爾排序,也叫作遞減增量排序。

3.**實現:

//最差時間複雜度—根據步長不同而不同

//最優時間複雜度——o(n)

//平均時間複雜度——根據步長不同而不同

//穩定性——不穩定

public class shellsort

a[k + gap] = temp;}}

}} new display();

display.display(a, n);

}}

1.利用對這種資料結構所設計的一種選擇排序演算法,堆是一種近似完全二叉樹的結構(通常堆是一維陣列來實現的),並滿足性質,以最大堆(也叫大根堆、大頂堆)為例,其父節點的值總是大於它的孩子節點。

2.步驟

(1)用輸入的無序陣列構造乙個最大堆,作為初始的無序區;

(2)把最大值即堆頂元素和堆尾元素互換;

(3)把堆(無序區)的尺寸縮小1,並呼叫heapify從新的堆頂元素開始調整;

(4)重複步驟2,直到堆的尺寸為1。

3.**實現

public class heapsort 

if(a[k] > temp)

} a[i] = temp; }

public static void heapsort(int a, int n)

for(int j = n - 1; j > 0; j--)

}}

1.快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序n個元素要o(nlogn)次比較。在最壞狀況下則需要o(n^2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他o(nlogn)演算法更快,因為它的內部迴圈可以在大部分的架構上很有效率地被實現出來。

2.快速排序使用分治策略(divide and conquer)來把乙個序列分為兩個子串行。步驟為:

(1).從序列中挑出乙個元素,作為"基準"(pivot).

(2).把所有比基準值小的元素放在基準前面,所有比基準值大的元素放在基準的後面(相同的數可以到任一邊),這個稱為分割槽(partition)操作。

(3).對每個分割槽遞迴地進行步驟1~2,遞迴的結束條件是序列的大小是0或1,這時整體已經被排好序了。

3.**實現

public class quicksort 

int i = low;

int j = high;

int key = a[low];

while (i < j)

while (a[i] > key && i < j)

if(i < j)

} swap.swap(a, low, i);

quicksort(a, low, i - 1);

quicksort(a, i + 1, high);

}}

演算法(一)排序

一 o n 2 的排序演算法 1.選擇排序 selection sort 先找到最小的 public static void selectsort int arr 2.氣泡排序 bubble sort 先找到最大的 public static void bubblesort int arr 3.插入...

演算法(一) 排序sorting

問題 輸入數字a1,a2,a3.an,使其公升序輸出。1 插入排序 insertion sort 演算法 這個演算法從陣列的第二個元素開始迴圈,將選中的元素與之前的元素一一比較,如果選中的元素小於之前的元素,則將之前的元素後移,最後再將選中的元素放在合適的位置。在這個演算法執行的過程中,總是保持著索...

java演算法(一) 排序演算法(上)

排序 sort 是將一組資料按照一定的規則來進行排列,一般按照遞增或者遞減的順序來進行排列。排序演算法是一種最基本的演算法,但是在實際應用中非常廣泛,對於初學程式設計人來說,排序演算法也是最基本的演算法之一。本節主要講解排序演算法中相對簡單的幾種,分別是 1 氣泡排序 2 選擇排序 3 插入排序 後...