算法具有的特征:有限性、確定性、可行性、輸入性、輸出性
typedef struct BNode
{
int date;
struct BNode* lchild, * rchild;
}BTNode;
int Submt(BTNode* bt)
{
if (bt->lchild == NULL && bt->rchild == NULL)
return bt->date;
return Submt(bt->lchild) + Submt(bt->rchild) + bt->date;
}
遞歸求解數組最大值:
int fmax(int a[], int i)
{
if (i == 1)
return a[0];
return max(fmax(a, i - 1),a[i-1]);
}
遞歸刪除單鏈表中所有數據:
void Destroy(ListNode* p)
{
if (p->next != NULL)
{
Destroy(p);
free(p);
}
}
二叉樹遞歸查找x路徑
bool Findxpath(BTNode *bt, int x, vector<int> temp, vector<int>& path)
{
if (bt == NULL)
return false;
temp.push_back(bt->date);
if (bt->date == x)
{
path = temp;
return true;
}
bool find = Findxpath(bt->lchild, x, temp, path);
if (find)
return true;
Findxpath(bt->rchild, x, temp, path);
}
遞歸輸出各個位數的數字
void Find(int n)
{
if (n != 0)
{
Find(n / 10);
printf("%d", n % 10);
}
}
選擇排序算法
void SelectSort(int a[], int n, int i)
{
int j,k;
if (i == n - 1)
return;
k = i;
for (j = i + 1; j < n; j++)
{
if (a[k] > a[j])
k = j;
}
if (k != i)
swap(a[i], a[k]);
SelectSort(a, n, i + 1);
}
分治法的時間復雜度
快速排序用分治法實現:
int Partitionx(int a[], int s, int t)
{
int i = s , j = t;
int tmp = a[s]; //用序列的第1個記錄作為基准
while (i != j) //從序列兩端交替向中間掃描,直至i=j為止
{
while (j > i && a[j] >= tmp)
j--; //從右向左掃描,找第1個關鍵字小於tmp的a[j]
a[i] = a[j]; //將a[j]前移到a[i]的位置
while (i < j && a[i] <= tmp)
i++; //從左向右掃描,找第1個關鍵字大於tmp的a[i]
a[j] = a[i]; //將a[i]后移到a[j]的位置
}
a[i] = tmp;
return i;
}
void QuickSort(int a[], int l, int r)
{
if (r <= l) return;
int i = Partitionx(a, l, r);
QuickSort(a, l, i - 1);
QuickSort(a, i + 1, r);
}
自頂向下的二路歸並排序算法
void Merge(int a[],int low,int mid,int high)
//a[low..mid]和a[mid+1..high]→a[low..high]
{
int* tmpa;
int i = low,j = mid + 1,k = 0;
tmpa = (int*)malloc((high - low + 1) * sizeof(int));
while (i <= mid && j <= high)
if (a[i] <= a[j]) //將第1子表中的元素放入tmpa中
{
tmpa[k] = a[i]; i++; k++;
}
else //將第2子表中的元素放入tmpa中
{
tmpa[k] = a[j]; j++; k++;
}
while (i <= mid) //將第1子表余下部分復制到tmpa
{
tmpa[k] = a[i]; i++; k++;
}
while (j <= high) //將第2子表余下部分復制到tmpa
{
tmpa[k] = a[j]; j++; k++;
}
for (k = 0,i = low; i <= high; k++,i++) //將tmpa復制回a中
a[i] = tmpa[k];
free(tmpa); //釋放tmpa所占內存空間
}
void MergePass(int a[],int length,int n)
//一趟二路歸並排序
{
int i;
for (i = 0; i + 2 * length - 1 < n; i = i + 2 * length) //歸並length長的兩相鄰子表
Merge(a,i,i + length