school class
輸入input
輸出output
明確性definiteness
有效性finiteness
有限性effectiveness
big O 代表f(n)的上限
- O(1)
- O(logN)
- O(N)
- O(NlogN)
- O(2N)
- O(N^2)
- O(N^3)
omega 代表f(n)的下限
theta 代表f(n)的上限與下限,較精確
氣泡排序
- 每一回合逐一比較相臨資料,依排序之順序交換位置。
- 每回合至少會有一次交換位置,至沒交換位置則停止。
BubSort(int A[], int n) //氣泡排序法之副程式
{
int i, j , k,t=1, Temp,sp;
for (i=n-1; i>0; i--)
{
sp=1;
for (j =0; j <=i; j++)
if (A[j] > A[j+1])
{ //兩數交換位置
Temp = A[j];
A[j] = A[j+1];
A[j+1] = Temp;
sp=0;
}
if (sp==1) break;
}
}
選擇排序
- 未排序前之第一筆資料可視為已排序好之資料
- 每一回合逐一比較相臨資料,依排序之順序交換位置。
SelSort(int A[], int n) //選擇排序法之副程式
{
int i, j, Temp, NP = 0;
for (i = 1; i <= n - 1; i++)
{
NP = i;
for (j = i + 1; j <= n; j++)
if (A[j] > A[NP]) NP = j;
{//相鄰兩個的資料交換位置
Temp = A[i];
A[i] = A[NP];
A[NP] = Temp;
}
}
}
插入排序
- 將待排序之資料逐一與已排序後之資料比較,再將資料放入適當位置。
- 由最大(最小)逐回合比較至最小(最大)。
InSort(int A[], int n) //插入排序法之副程式
{
int i, j, Temp;
for (i = 1; i <= n; i++)
{
Temp=A[i];
j=i-1;
while (Temp<A[j])
{
A[j+1]=A[j];
j--;
if(j==-1) break;
}
A[j+1]=Temp;
}
}
快速排序
- 取第一個記錄為鍵值K0,當中間值。
-由左而右找第一個Ki,使得Ki≧K0。由右而左找第一個Kj,使得Kj≦K0。也就是說,從左邊找比K0大,從右邊找比K0小。- 若i<j則Ki與Kj對調位置繼續步驟2;否則K0與Kj對調位置,並以j為基準,分為兩個未排序之序列。以遞迴呼叫方式對左右兩邊進行排序,直道完成排序。
- 由最大(最小)逐回合比較至最小(最大)。
QuickSort(int A[], int left, int right)
{
int i, j, s , Temp;
if(left < right) {
s = A[(left+right)/2];
i = left - 1;
j = right + 1;
while(1) {
while(A[++i] < s) ; // 向右找
while(A[--j] > s) ; // 向左找
if(i >= j) break;
Temp = A[i];
A[i] = A[j];
A[j] = Temp;
}
QuickSort(A, left, i-1); // 對左邊進行遞迴
QuickSort(A, j+1, right); // 對右邊進行遞迴
}
}
堆積排序
Heapsort(int A[]) {
int i, m, p, s,t=1;
m = MAX;
while(m > 1) {
SWAP(A[1], A[m]);
m--;
p = 1;
s = 2 * p;
while(s <= m) {
if(s < m && A[s+1] < A[s]) s++;
if(A[p] <= A[s]) break;
SWAP(A[p], A[s]);
p = s;
s = 2 * p;
}
}
}
薛爾排序
Shellsort(int A[])
{
int i, j, k, Gap, t;
Gap = MAX / 2;
while(Gap > 0)
{
for(k = 0; k < Gap; k++)
{
for(i = k+Gap; i < MAX; i+=Gap)
{
for(j = i - Gap; j >= k; j-=Gap)
{
if(A[j] > A[j+Gap])
{
SWAP(A[j], A[j+Gap]);
}
else break;
}
}
}
printf("\nGap = %d:", Gap);
for(i = 0; i < MAX; i++)
printf("%d ", A[i]);
Gap /= 2;
}
}
合併排序
Mergesort(int A[], int M, int B[],int N, int C[])
{
int i = 0, j = 0, k = 0;
while(i < M && j < N)
{
if(A[i] <= B[j]) C[k++] = A[i++];
else C[k++] = B[j++];
}
while(i < M) C[k++] = A[i++];
while(j < N) C[k++] = B[j++];
}
基數排序
Radix(int data[],int n)
{ int t=1;
while(n <= 10)
{
for(i = 0; i < 10; i++)
{
lsd = ((data[i] / n) % 10);
temp[lsd][order[lsd]] = data[i];
order[lsd]++;
}
if (t==1) printf("\n「個位數」為主排序:");
else printf("\n「十位數」為主排序:");
for(i = 0; i < 10; i++)
{
if(order[i] != 0)
for(j = 0; j < order[i]; j++)
{
data[k] = temp[i][j];
printf("%d ", data[k]);
k++;
}
order[i] = 0;
}
n *= 10;
k = 0;
t+=1;
}
}
一個有限的集合,有一或多個節點
分支度-每個節點下分出幾個節點
轉二元樹 左子右兄弟
連續的空間
資料好尋找
新增資料需要空出位置並移動
移除資料需要移動資料
節省新增移除資料的時間
資料不好尋找