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");
}

c语言中的经典算法的更多相关文章

  1. Java中的经典算法之冒泡排序(Bubble Sort)

    Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...

  2. Java中的经典算法之选择排序(SelectionSort)

    Java中的经典算法之选择排序(SelectionSort) 神话丿小王子的博客主页 a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...

  3. C语言中的经典例题用javascript怎么解?(一)

    C语言中的经典例题用javascript怎么解?(一) 一.1+2+3+……+100=?        <script type="text/javascript">  ...

  4. Java中的经典算法之快速排序(Quick Sort)

    Java中的经典算法之快速排序(Quick Sort) 快速排序的思想 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对 ...

  5. C语言100道经典算法

    经典的100个c算法 C语言的学习要从基础,100个经典的算法真不知道关于语言的应该发在那里,所以就在这里发了,发贴的原因有2个,第一个,这东西非常值得学习,第二个,想..........嘿嘿,大家应 ...

  6. C语言100个经典算法

    POJ上做做ACM的题 语言的学习基础,100个经典的算法C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的算法 题目:古典问题:有一对兔子,从出生后 ...

  7. Java中的经典算法之冒泡排序

    原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将 ...

  8. 分享知识-快乐自己:Java中的经典算法之冒泡排序(Bubble Sort)

    原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将 ...

  9. C语言中的排序算法--冒泡排序,选择排序,希尔排序

    冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没 ...

随机推荐

  1. HTML基础知识笔记(一)

    HTML定义 HTML指的是超文本标记语言 HTML不是编程语言,而是标记语言 标记语言是一套标记标签 HTML是用标记标签来描述网页   HTML标签1 <html></html& ...

  2. IOS 中关于自定义Cell 上的按钮 开关等点击事件的实现方法(代理)

    1.在自定义的Cell .h文件中写出代理,写出代理方法. @protocol selectButtonDelegate <NSObject> -(void)selectModelID:( ...

  3. QT错误:collect2:ld returned 1 exit status

    1.编译成功的例子在后台执行,有时一闪而过,如果再次build ,则会提示上述错误. 解决方法:打开任务管理器,找到相应的exe进程,关闭即可:  或者直接关闭QtCreator. 2.没有编译成功的 ...

  4. ARM指令和Thumb指令区别

    Thumb指令集 ]的问题而提出的,它具有16为的代码密度.Thumb不是一个完整的体系结构,不能指望处理程序只执行Thumb指令而不支持ARM指令集.因此,Thumb指令只需要支持通用功能,必要时, ...

  5. (原)caffe在ubuntu中设置GPU的ID号及使用多个GPU

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5884892.html 参考网址: http://caffe.berkeleyvision.org/tu ...

  6. cherry-pick,revert和rebase使用的3-way合并策略

    git中的cherry-pick,revert和rebase都使用的是3-way合并策略,下面就来看看这3个方法使用的merge-base,ours和theirs分别是什么. cherry-pick ...

  7. 一大坨GoogleAPI的学习笔记之一(oAuth2.0)

    官方文档地址:https://developers.google.com/accounts/docs/OAuth2InstalledApp 最近Ubuntu下VGA接口无端的不能用了,木有心情翻译了, ...

  8. linux curses函数库

    fedora20,安装yum install ncurses-devel 编译时:-lncurses 头文件:#include<curses.h> 参考:man ncurses \linu ...

  9. setPixel抛出java.lang.IllegalStateException

    原来,从ImageView里读取的Bitmap,或者加载drawable里的图片资源,返回的都是一个immutalbe的bitmap,所以不能用setpixels 必须采取类似Bitmap bmp = ...

  10. jQuery之事件

    (一).事件列表. 1.blur() 当失去焦点时触发.包括鼠标点击离开和TAB键离开. 2.change() 当元素获取焦点后,值改变失去焦点事触发. 3.click() 当鼠标单击时触发. 4.d ...