c语言经典排序以及查找方法
冒泡排序
#include <stdio.h>
int main()
{
int i, j, t, a[11]; /*定义变量及数组为基本整型*/
printf("please input 10 numbers:\n");
for (i = 1; i < 11; i++)
scanf("%d", &a[i]); /*从键盘中输入10个数*/
for (i = 1; i < 10; i++) /*变量i代表比较的趟数*/
for (j = 1; j < 11-i; j++) /*变量j代表每趟两两比较的次数*/
if (a[j] > a[j + 1])
{
t = a[j]; /*利用中间变量实现俩值互换*/
a[j] = a[j + 1];
a[j + 1] = t;
}
printf("the sorted numbers:\n");
for (i = 1; i <= 10; i++)
printf("%5d", a[i]); /*将冒泡排序后的顺序输出*/
return 0;
}
二分查找
#include <stdio.h>
void binary_search(int key, int a[], int n) /*自定义函数binary_search*/
{
int low, high, mid, count = 0, count1 = 0;
low = 0;
high = n - 1;
while (low < high) /*当查找范围不为0时执行循环体语句*/
{
count++; /*count记录查找次数*/
mid = (low + high) / 2; /*求出中间位置*/
if (key < a[mid]) /*当key小于中间值*/
high = mid - 1; /*确定左子表范围*/
else if (key > a[mid]) /*当key大于中间值*/
low = mid + 1; /*确定右子表范围*/
else if (key == a[mid]) /*当key等于中间值证明查找成功*/
{
printf("success!\nsearch %d times!a[%d]=%d", count, mid, key);
/*输出查找次数及所查找元素在数组中的位置*/
count1++; /*count1记录查找成功次数*/
break;
}
}
if (count1 == 0) /*判断是否查找失败*/
printf("no found!"); /*查找失败输出no found*/
}
main()
{
int i, key, a[100], n;
printf("please input the length of array:\n");
scanf("%d", &n); /*输入数组元素个数*/
printf("please input the element:\n");
for (i = 0; i < n; i++)
scanf("%d", &a[i]); /*输入有序数列到数组a中*/
printf("please input the number which do you want to search:\n");
scanf("%d", &key); /*输入要查找的关键字*/
binary_search(key, a, n); /*调用自定义函数*/
}
分块查找
#include <stdio.h>
struct index /*定义块的结构*/
{
int key;
int start;
int end;
} index_table[4]; /*定义结构体数组*/
int block_search(int key, int a[]) /*自定义实现分块查找*/
{
int i, j;
i = 1;
while (i <= 3 && key > index_table[i].key) /*确定在那个块中*/
i++;
if (i > 3) /*大于分得的块数,则返回0*/
return 0;
j = index_table[i].start; /*j等于块范围的起始值*/
while (j <= index_table[i].end && a[j] != key) /*在确定的块内进行查找*/
j++;
if (j > index_table[i].end) /*如果大于块范围的结束值,则说明没有要查找的数,j置0*/
j = 0;
return j;
}
main()
{
int i, j = 0, k, key, a[16];
printf("please input the number:\n");
for (i = 1; i < 16; i++)
scanf("%d", &a[i]); /*输入由小到大的15个数*/
for (i = 1; i <= 3; i++)
{
index_table[i].start = j + 1; /*确定每个块范围的起始值*/
j = j + 1;
index_table[i].end = j + 4; /*确定每个块范围的结束值*/
j = j + 4;
index_table[i].key = a[j]; /*确定每个块范围中元素的最大值*/
}
printf("please input the number which do you want to search:\n");
scanf("%d", &key); /*输入要查询的数值*/
k = block_search(key, a); /*调用函数进行查找*/
if (k != 0)
printf("success.the position is :%d\n", k); /*如果找到该数,则输出其位置*/
else
printf("no found!"); /*若未找到则输出提示信息*/
}
归并排序
#include <stdio.h>
main()
{
int i, j, t, a[11]; /*定义变量及数组为基本整型*/
printf("please input 10 numbers:\n");
for (i = 1; i < 11; i++)
scanf("%d", &a[i]); /*从键盘中输入要排序的10个数字*/
for (i = 1; i <= 9; i++)
for (j = i + 1; j <= 10; j++)
if (a[i] > a[j]) /*如果后一个数比前一个数大则利用中间变量t实现俩值互换*/
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
printf("the sorted numbers:\n");
for (i = 1; i <= 10; i++)
printf("%5d", a[i]); /*将排好序的数组输出*/
}
#include <stdio.h>
void merge(int r[], int s[], int x1, int x2, int x3) /*实现一次归并排序函数*/
{
int i, j, k;
i = x1; /*第一部分的开始位置*/
j = x2 + 1; /*第二部分的开始位置*/
k = x1;
while ((i <= x2) && (j <= x3))
/*当i和j都在两个要合并的部分中*/
if (r[i] <= r[j])
/*筛选两部分中较小的元素放到数组s中*/
{
s[k] = r[i];
i++;
k++;
}
else
{
s[k] = r[j];
j++;
k++;
}
while (i <= x2)
/*将x1~x2范围内的未比较的数顺次加到数组r中*/
s[k++] = r[i++];
while (j <= x3)
/*将x2+1~x3范围内的未比较的数顺次加到数组r中*/
s[k++] = r[j++];
}
void merge_sort(int r[], int s[], int m, int n)
{
int p;
int t[20];
if (m == n)
s[m] = r[m];
else
{
p = (m + n) / 2;
merge_sort(r, t, m, p);
/*递归调用merge_sort函数将r[m]~r[p]归并成有序的t[m]~t[p]*/
merge_sort(r, t, p + 1, n); /*递归调用merge_sort函数将r[p
+1]~r[n]归并成有序的t[p+1]~t[n]*/
merge(t, s, m, p, n); /*调用函数将前两部分归并到s[m]~s[n]*/
}
}
main()
{
int a[11];
int i;
printf("please input 10 numbers:\n");
for (i = 1; i <= 10; i++)
scanf("%d", &a[i]);
/*从键盘中输入10个数*/
merge_sort(a, a, 1, 10); /*调用merge_sort函数进行归并排序*/
printf("the sorted numbers:\n");
for (i = 1; i <= 10; i++)
printf("%5d", a[i]);
/*将排序后的结构输出*/
}
哈希查找
#include <stdio.h>
#include <time.h>
#define Max 11
#define N 8
int hashtable[Max];
int func(int value)
{
return value % Max; /*哈希函数*/
}
int search(int key) /*自定义函数实现哈希查询*/
{
int pos, t;
pos = func(key); /*哈希函数确定出的位置*/
t = pos; /*t存放确定出的位置*/
while (hashtable[t] != key && hashtable[t] != - 1)
/*如果该位置上不等于要查找的关键字且不为空*/
{
t = (t + 1) % Max; /*利用线性探测求出下一个位置*/
if (pos == t)
/*如果经多次探测又回到原来用哈希函数求出的位置则说明要查找的数不存在*/
return - 1;
}
if (hashtable[t] == - 1)
/*如果探测的位置是-1则说明要查找的数不存在*/
return NULL;
else
return t;
}
void creathash(int key) /*自定义函数创建哈希表*/
{
int pos, t;
pos = func(key); /*哈希函数确定元素的位置*/
t = pos;
while (hashtable[t] != - 1)
/*如果该位置有元素存在则进行线性探测再散列*/
{
t = (t + 1) % Max;
if (pos == t)
/*如果冲突处理后确定的位置与原位置相同则说明哈希表已满*/
{
printf("hash table is full\n");
return ;
}
}
hashtable[t] = key; /*将元素放入确定的位置*/
}
main()
{
int flag[50];
int i, j, t;
for (i = 0; i < Max; i++)
hashtable[i] = - 1;
/*哈希表中初始位置全置-1*/
for (i = 0; i < 50; i++)
flag[i] = 0;
/*50以内所有数未产生时均标志为0*/
srand((unsigned long)time(0)); /*利用系统时间做种子产生随机数*/
i = 0;
while (i != N)
{
t = rand() % 50; /*产生一个50以内的随机数赋给t*/
if (flag[t] == 0)
/*查看t是否产生过*/
{
creathash(t); /*调用函数创建哈希表*/
printf("%2d:", t); /*将该元素输出*/
for (j = 0; j < Max; j++)
printf("(%2d) ", hashtable[j]);
/*输出哈希表中内容*/
printf("\n");
flag[t] = 1; /*将产生的这个数标志为1*/
i++; /*i自加*/
}
}
printf("please input number which do you want to search:");
scanf("%d", &t); /*输入要查找的元素*/
if (t > 0 && t < 50)
{
i = search(t); /*调用search进行哈希查找*/
if (i != - 1)
printf("success!The position is:%d\n", i);
/*若查找到该元素则输出其位置*/
else
printf("sorry,no found!");
/*未找到输出提示信息*/
}
else
printf("inpput error!");
}
快速排序
#include <stdio.h>
void qusort(int s[], int start, int end) /*自定义函数qusort()*/
{
int i, j; /*定义变量为基本整型*/
i = start; /*将每组首个元素赋给i*/
j = end; /*将每组末尾元素赋给j*/
s[0] = s[start]; /*设置基准值*/
while (i < j)
{
while (i < j && s[0] < s[j])
j--; /*位置左移*/
if (i < j)
{
s[i] = s[j]; /*将s[j]放到s[i]的位置上*/
i++; /*位置右移*/
}
while (i < j && s[i] <= s[0])
i++; /*位置右移*/
if (i < j)
{
s[j] = s[i]; /*将大于基准值的s[j]放到s[i]位置*/
j--; /*位置右移*/
}
}
s[i] = s[0]; /*将基准值放入指定位置*/
if (start < i)
qusort(s, start, j - 1); /*对分割出的部分递归调用函数qusort()*/
if (i < end)
qusort(s, j + 1, end);
}
main()
{
int a[11], i; /*定义数组及变量为基本整型*/
printf("please input numbers:\n");
for (i = 1; i <= 10; i++)
scanf("%d", &a[i]); /*从键盘中输入10个要进行排序的数*/
qusort(a, 1, 10); /*调用qusort()函数进行排序*/
printf("the sorted numbers:\n");
for (i = 1; i <= 10; i++)
printf("%5d", a[i]); /*输出排好序的数组*/
}
顺序查找
#include <stdio.h>
void search(int key, int a[], int n) /*自定义函数search*/
{
int i, count = 0, count1 = 0;
for (i = 0; i < n; i++)
{
count++; /*count记录查找次数*/
if (a[i] == key) /*判断要查找的关键字与数组中的元素是否相等*/
{
printf("search %d times a[%d]=%d\n", count, i, key); /*输出查找次数及在数组中的位置*/
count1++; /*count1记录查找成功次数*/
}
}
if (count1 == 0) /*判断是否查找到h*/
printf("no found!"); /*如果未查找到输出no found*/
}
main()
{
int n, key, a[100], i;
printf("please input the length of array:\n");
scanf("%d", &n); /*输入要输入的元素个数*/
printf("please input element:\n");
for (i = 0; i < n; i++)
scanf("%d", &a[i]); /*输入元素存到数组a中*/
printf("please input the number which do you want to search:\n");
scanf("%d", &key); /*指定要查找的元素*/
search(key, a, n); /*调用自定义的search函数*/
}
希尔排序
#include <stdio.h>
void shsort(int s[], int n) /*自定义函数shsort*/
{
int i, j, d;
d = n / 2; /*确定固定增量值*/
while (d >= 1)
{
for (i = d + 1; i <= n; i++) /*数组下标从d+1开始进行直接插入排序*/
{
s[0] = s[i]; /*设置监视哨*/
j = i - d; /*确定要进行比较的元素的最右边位置*/
while ((j > 0) && (s[0] < s[j]))
{
s[j + d] = s[j]; /*数据右移*/
j = j - d; /*向左移d个位置*/
}
s[j + d] = s[0]; /*在确定的位置插入s[i]*/
}
d = d / 2; /*增量变为原来的一半*/
}
}
main()
{
int a[11], i; /*定义数组及变量为基本整型*/
printf("please input numbers:\n");
for (i = 1; i <= 10; i++)
scanf("%d", &a[i]); /*从键盘中输入10个数据*/
shsort(a, 10); /*调用shsort()函数*/
printf("the sorted numbers:\n");
for (i = 1; i <= 10; i++)
printf("%5d", a[i]); /*将排好序的数组输出*/
}
选择排序
#include <stdio.h>
main()
{
int i, j, t, a[11]; /*定义变量及数组为基本整型*/
printf("please input 10 numbers:\n");
for (i = 1; i < 11; i++)
scanf("%d", &a[i]); /*从键盘中输入要排序的10个数字*/
for (i = 1; i <= 9; i++)
for (j = i + 1; j <= 10; j++)
if (a[i] > a[j]) /*如果后一个数比前一个数大则利用中间变量t实现俩值互换*/
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
printf("the sorted numbers:\n");
for (i = 1; i <= 10; i++)
printf("%5d", a[i]); /*将排好序的数组输出*/
}
直接插入排序
#include <stdio.h>
void insort(int s[], int n) /*自定义函数isort*/
{
int i, j;
for (i = 2; i <= n; i++) /*数组下标从2开始,0做监视哨,1一个数据无可比性*/
{
s[0] = s[i]; /*给监视哨赋值*/
j = i - 1; /*确定要进行比较的元素的最右边位置*/
while (s[0] < s[j])
{
s[j + 1] = s[j]; /*数据右移*/
j--; /*移向左边一个未比较的数*/
}
s[j + 1] = s[0]; /*在确定的位置插入s[i]*/
}
}
main()
{
int a[11], i; /*定义数组及变量为基本整型*/
printf("please input number:\n");
for (i = 1; i <= 10; i++)
scanf("%d", &a[i]); /*接收从键盘中输入的10个数据到数组a中*/
printf("the original order:\n");
for (i = 1; i < 11; i++)
printf("%5d", a[i]); /*将为排序前的顺序输出*/
insort(a, 10); /*调用自定义函数isort()*/
printf("\nthe sorted numbers:\n");
for (i = 1; i < 11; i++)
printf("%5d", a[i]); /*将排序后的数组输出*/
printf("\n");
}