查找算法
顺序表查找
int Sequential_search(int *a, int n, int key)
{
int i;
for (i = 1; i <= n; i++)
{
if (a[i] == key)
return i;
}
return 0;
}
优化:
int Sequential_search2(int *a, int n, int key)
{
int i;
a[0] = key;
i = n;
while (a[i] != key)
{
i--;
}
return i--;
}
有序表查找
折半查找(二分查找)
int Binary_Search(int *a, int n, int key)
{
int low, high, mid;
low = 1;
high = n;
while (low <= high)
{
mid = (low + high) / 2;
if (key < a[mid])
high = mid - 1;
else if (key > a[mid])
low = mid + 1;
else
return mid;
}
return 0;
}
插值查找
int Binary_Search(int *a, int n, int key)
{
int low, high, mid;
low = 1;
high = n;
while (low <= high)
{
mid = low + (high-low)*(key-a[low])/(a[high]-a[low]);/*插值公式*/
if (key < a[mid])
high = mid - 1;
else if (key > a[mid])
low = mid + 1;
else
return mid;
}
return 0;
}
斐波那契查找(黄金分割)
//斐波那契数组
int F(int i)
{
if (i < 2)
return i == 0 ? 0 : 1;
return F(i - 1) + F(i - 2);
}
int Fibonacci_search(int *a, int n, int key)
{
int low, high, mid, i, k;
low = 1;
high = n;
k = 0;
while (n > F(k) - 1)
k++;
for (i = n; i < F(k) - 1; i++)
a[i] = a[n];
while (low <= high)
{
mid = low + F(k-1) - 1;
if (key < a[mid])
{
high = mid - 1;
k = k - 1;
}
else if (key > a[mid])
{
low = mid + 1;
k = k - 2;
}
else
{
if (mid <= n)
return mid;
else
return n;
}
}
return 0;
}
无序表查找
索引:线性索引、树形索引、多级索引
线性索引;稠密索引、分块索引、倒排索引/
排序算法
//内排序分为:插入排序、交换排序、选择排序喝归并排序
冒泡排序
# define MAXSIZE 10
typedef int ElemType;
typedef struct
{
int r[MAXSIZE+1];
int length;
}SqList;
void swap(SqList *L, int i, int j)
{
int temp = L->r[i];
L->r[i] = L->r[j];
L->r[j] = temp;
}
第一种冒泡排序
void BubbleSort0(SqList *L)
{
int i, j;
for (i = 1; i < L->length; i++)
{
for (j = i + 1; j <= L->length; j++)
{
if (L->r[i] > L->r[j])
{
swap(L, i, j);
}
}
}
}
第二种冒泡排序
void BubbleSort(SqList *L)
{
int i, j;
for (i = 1; i < L->length; i++)
{
for (j = L->length - 1; j >= i; j--)
{
if (L->r[j] > L->r[j + 1])
{
swap(L, j, j + 1);
}
}
}
}
第三种冒泡排序
void BubbleSort2(SqList *L)
{
int i, j;
Status flag = TRUE;
for (i = 1; i < L->length && flag; i++)
{
flag = FALSE;
for (j = L->length - 1; j >= i; j--)
{
if (L->r[j] > L->r[j + 1])
{
swap(L, j, j + 1);
flag = TRUE;
}
}
}
}
简单选择排序
void SelectSort(SqList *L)
{
int i, j, min;
for (i = 1; i < L->length; i++)
{
min = i;
for (j = i + 1; j <= L->length; j++)
{
if (L->r[min] > L->r[j])
min = j;
}
if (i != min)
swap(L, i, min);
}
}
直接插入排序
void InsertSort(SqList *L)
{
int i, j;
for (i = 2; i <= L->length; i++)
{
if (L->r[i] < L->r[i - 1])
{
L->r[0] = L->r[i];
for (j = i - 1; L->r[j] > L->r[0]; j--)
L->r[j + 1] = L->r[j];
L->r[j + 1] = L->r[0];
}
}
}
希尔排序
void ShellSort(SqList *L)
{
int i, j;
int increment = L->length;
do
{
increment = increment / 3 + 1;
for (i = increment + 1;i<=L->length; i++)
{
if (L->r[i] < L->r[i - increment])
{
L->r[0] = L->r[i];
for (j = i - increment; j > 0 && L->r[0] < L->r[j]; j -= increment)
L->r[j + increment] = L->r[j];
L->r[j + increment] = L->r[0];
}
}
} while (increment > 1);
}