动态数组 选择排序 二分搜索技术

 

实验课程:算法分析与设计

实验名称:基于排序的二分搜索技术    

实验目标:

1)理解分治法的基本思想。

2)分析二分搜索算法的时间复杂度,加深对时间复杂的理解。

实验任务:

1)产生实验数据,即可手动输入,又可随机产生。

2C++语言编程实现一种排序算法,如:简单排序、插入排序、选择排序或其他排序方法。

3C++语言编程实现二分搜索算法。

4)记录二分搜索过程中比较的次数,验证二分搜索的时间复杂度O(logn)

实验设备及环境

PCVisual C++等编程环境。

实验主要步骤:

(1)     明确实验目标和具体任务;

(2)     理解实验所涉及的算法;

(3)     编写程序实现排序算法和二分搜索算法;

(4)   产生实验数据(随机)作为输入,运行排序算法,将排序后的结果作为输入来运行二分搜索算法,记录运行的结果(包括:是否找到和比较的次数)。

(5)     根据实验数据及其结果得出结论。

下面是本人的代码:

 

 

 

// 第三周实验.cpp : Defines the entry point for the console application.
/*使用动态生成一位数组实现手动或随机生成一个数组。在使用选择排序实现数组的排序。
输入用户需要输入的数字,再在数组中查找,如果找到,输出查找的次数,并且输出这个数字在排好序的数组中的位置。
*/
#include "stdafx.h"

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
using namespace std;

int devide_search(int *count,int x,int n);

int main(int argc, char* argv[])
{
 int flag;
 int temp;
 int k;
 int x; 
 int num; //作为要搜索的数的变量
 int m;
 
 
 int *count=new int[x];

 cout<<"请随便输入一个数字:";
 cin>>x;

 cout<<"请选择输入数组的方式(0(手动),1(随机)):";
 cin>>flag;
 if(flag==0)
 {
  for(int a=0;a<x;a++)
   cin>>count[a];
 }
 else if(flag==1)
 {
  for(int i=0;i<x;i++)
  {
   count[i]=rand()%x;
  }
 }
 else
  cout<<"输入有误!"<<endl;

 cout<<"随机生成的数为: /n";

 for(int j=0;j<x;j++)
 {
  cout<<count[j]<<"/t";
  if(j%10==0&&j!=0)
  {
   cout<<endl;
  }
 }
 cout<<endl;

/
/*对数组进行选择排序           */
/
 for(int z=0;z<x-1;z++)
 {
  k=z;
  for(int j=z+1;j<x;j++)
  {
   if(count[j]<count[k])
    k=j;
  }
  if(k!=z)
  {
    m=count[z];
    count[z]=count[k];
    count[k]=m;
  }
 }

 /
 for(int y=0;y<x;y++)
 {
  cout<<count[y]<<"/t";
  if(y%10==0&&y!=0)
  {
   cout<<endl;
  }
 }

 cout<<endl;
 /
 /*使用二分搜索对数组进行搜索                       */
 /
 cout<<"请输入一个数字:";
 cin>>num;
 cout<<endl;

 temp=devide_search(count,num,x);

 if(temp==-1)
 {
  cout<<"在数组中找不到你要找的数!";
 }
 else
  cout<<"你要查找的数字在数组中的第 "<<temp<<" 位"<<endl;

 cout<<endl;
 delete[] count;
 return 0;
}

int devide_search(int *count,int num,int x)
{
 int left=0;
 int right=x-1;
 int sum=0;
 while(left<=right)
 {
  int middle=(left+right)/2;
  if(num==count[middle])
  {
   sum++;
   cout<<"二分搜索过程中比较的次数为:"<<sum<<endl;
   return (middle+1);
  }
  else if(num>count[middle])
  {
   sum++;
   left=middle+1;
  }
  else
  {
   sum++;
   right=middle-1;
  }
 }
 return -1;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大只辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值