折半查找冒泡排序堆排序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据与结构实验报告
折半查找法、冒泡法与堆排序一实验设计:
(1)用折半查找法找到需要查找目标的位置
(2)用冒泡法把输入数据从小到大排列
(3)用堆排序法把输入的数据从小到大排列
二算法设计:
1.冒泡排序与折半查找的共同应用
#include
#include
void maopao(int a[])/*冒泡排序*/
{
int k,i,j,t;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
if(a[i]==0)
break;
}
k=i;
for(i=0;i { for(j=i;j { if(a[i]>a[j]) { t=a[i]; a[i]=a[j]; a[j]=t; } } } for(i=0;i { printf("%d\t",a[i]); } } int chazhao(int a[],int _value,int n) { // 二分法(也称折半查找法) int index=0; // 当前数组的首元素下标 int current=n-1; // 数组当前的大小 int k; // 当前数组中间的数的下标 while (index<=current) { // 开始二分法查找 k=(index+current)/2; // 除以2代表得到当前数组中间的数的下标 if(a[k]==_value) return k+1; // 返回要查找的值_value所在的下标 // 否则比较要查找的值_value是在折半后的前半部分还是后半部分 if(a[k]<_value)// 说明要查找的值在折半后的后半部分 index=k+1; // 令index指向后半部分数组的首元素 else // 说明要查找的值在折半后的前半部分 current=k-1; // 令current等于前半部分数组的长度} return -1; // 返回-1代表没有查找到该值(_value) } void main() { int a[10],c; maopao(a); scanf("%d",&c); printf("%d",chazhao(a,c,10)); } 2.堆查找的单独应用 #include #include #include void BigHeapAdjust(int *p, int r, int len); void BigHeapSort(int *p, int len); int main() { int array[1000] = {0}; int n; printf("请输入排序元素的个数:\n"); scanf("%d", &n); printf("请输入要排序的元素:\n"); for(int i=0; i scanf("%d", array+i); BigHeapSort(array, n); printf("结果是:\n"); for(int k=0; k printf("%d ", array[k]); getchar(); getchar(); getchar(); return 0; } void BigHeapAdjust(int *p, int r, int len) { int tmp = p[r]; int j; for(j=2*r+1; j<=len-1; j=2*j+1) { if(j ++j; if(tmp >= p[j]) break; p[r] = p[j]; r = j; } p[r] = tmp; } void BigHeapSort(int *p, int len) { int i,j; for(i=len/2-1; i>=0; --i) BigHeapAdjust(p, i, len); p[0] ^= p[len-1]; p[len-1] ^= p[0]; p[0] ^= p[len-1]; for(j=len-1; j>1; --j) { BigHeapAdjust(p, 0, j); p[0] ^= p[j-1]; p[j-1] ^= p[0]; p[0] ^= p[j-1]; } } 三实验结果 冒泡排序与折半查找 输入10个数(78 90 30 29 10 74 2 6 5 7)先冒泡排序从小到大排列输入查找7这个数据 显示在从小到大的数组中排第4位