前言
作者能力有限,仅代表个人浅显理解
所有代码经过测试均符合实际
一、排序
1.插入排序
说明:在已排序好的序列中插入数字
以下代码
#include <stdio.h>
#define LEN 5
int a[LEN] = {1, 5, 1, 5, 7};
void ins_sort(void)
{
int i,j,key;
for (j = 1; j < LEN; ++j) {
key = a[j];
i = j - 1;
while (i >= 0 && a[i] > key) {
a[i+1] = a[i];
--i;
}
a[i+1] = key;
}
for (i = 0; i < LEN; i++) {
printf("%d ", a[i]);
}
}
int main(void)
{
ins_sort();
return 0;
}
2.归并排序
说明:sort()函数用于分割数组;merge()归并排序
从最小的分割数组sort(0,1)仅有两个元素的开始归并,确保每次归并前的数组都是有序的
函数进入过程如下
LEN = 8
a[LEN] = {5, 2, 4, 7, 1, 3, 2, 6}
sort(0, 7){
start = 0; end = 7; mid = 3;
>"sort(0-3, 4-7)"
sort(0, 3){
start = 0; end = 3; mid = 1;
>"sort(0-1, 2-3)"
sort(0, 1){
start = 0; end = 1; mid = 0;
>"sort(0-0, 1-1)"
sort(0, 0){
...
}
sort(1, 1){
...
}
merge(0, 0, 1)
>"merge(0-0, 1-1)"
}
sort(2, 3){
start=2; end=3; mid=2;
>"sort(2-2, 3-3)"
...
...
merge(2,2,3)
>"merge(2-2, 3-3)"
}
merge(0, 1, 3)
>"merge(0-1, 2-3)"
}
sort(4, 7){
}
}
代码如下(本人菜鸡,代码抄书)
#include <stdio.h>
#define LEN 8
int a[LEN] = { 5, 2, 4, 7, 1, 3, 2, 6 };
void merge(int start, int mid, int end)
{
int n1 = mid - start + 1;
int n2 = end - mid;
int left[LEN], right[LEN];
int i, j, k;
for (i = 0; i < n1; i++) /* left holds
a[start..mid] */
left[i] = a[start+i];
for (j = 0; j < n2; ++j) /* right holds
a[mid+1..end] */
right[j] = a[mid+1+j];
i = j = 0;
for (k = start; i < n1 && j < n2; ++k) {
if (left[i] < right[j]) {
a[k] = left[i];
++i;
} else {
a[k] = right[j];
++j;
}
}
if (i < n1) /* left[] is not
exhausted */
for (; i < n1; i++) {
a[k] = left[i];
++k;
}
if (j < n2) /* right[] is not
exhausted */
for (; j < n2; ++j) {
a[k] = right[j];++k;
}
}
void sort(int start, int end)
{
int mid;
if (start < end) {
mid = (start + end) / 2;
printf("sort (%d-%d, %d-%d) %d %d %d %d %d %d "
"%d %d\n",start, mid, mid+1, end,
a[0], a[1], a[2], a[3], a[4],
a[5], a[6], a[7]);
sort(start, mid);
sort(mid + 1, end);
merge(start, mid, end);
printf("merge (%d-%d, %d-%d) to %d %d "
"%d %d %d %d %d %d\n",
start, mid, mid+1, end,
a[0], a[1], a[2], a[3], a[4],
a[5], a[6], a[7]);
}
}
int main(void)
{
sort(0, LEN-1);
return 0;
}
二、查找
1.线性查找
说明:从头或者从尾一个一个查找
以下代码
#include <stdio.h>
char a[]="hello world";
int indexof(char letter)
{
int i = 0;
while (a[i] != '\0') {
if (a[i] == letter)
return i;
i++;
}
return -1;
}
int main(void)
{
printf("%d %d\n", indexof('o'), indexof('z'));
return 0;
}
2.折半查找
说明:根据有序序列,折半寻找
以下代码
#include <stdio.h>
#define LEN 8
int a[LEN] = { 1, 3, 3, 3, 4, 5, 6, 7 };
int binarysearch(int number)
{
int mid, start = 0, end = LEN - 1;
while (start <= end) {
mid = (start + end) / 2;
if (a[mid] < number)
start = mid + 1;
else if (a[mid] > number)
end = mid - 1;
else
return mid;
}
return -1;
}
int main(void)
{
printf("%d\n", binarysearch(3));
return 0;
}