快速排序加生成随机数加二分搜索(分治法)

最近要求做一个算法实验,就是用二分法写快速排序,当然我们还要测试,还需要大量的数据测试,但是我们知道通过rand函数的话,我们最大的函数范围才为30000多,这个rand的原理是通过初等数论中的同余定理而来(我也不太懂,因为没学过初等数论),接下来就是演示代码及解释我对如何产生10万个数字的随机不重复的数组理解。

#include"Qsort.h" 
#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
#define N 100

void permutation(int n, int *z_array)
{
  int i, j, k, z;
  int buffer[N]; 
  /* 初始化数组 */
  for (i=0; i<n; i++)
    buffer[i]=0;
  /* 准备生成随机数,以当前时间为种子 */
  srand((unsigned)time(NULL));
  /* 获得不重复的随机数据 */
  for (i=0; i<n; i++) {
    /* 获得0~(n-i)的随机数据 */
    z = rand()%(n-i);
    j=0; k=0;
    while (j<=z) {
      if (buffer[j+k]==0) j++;
      else k++;
    }
    buffer[j+k-1]=1;
    z_array[i]=j+k-1;
  }
  return;
}
int main()
{
	int n=100;
	int a[n] = {0};
	int b[n/2] = {0};
	permutation(n,a);
	for(int i=0 ; i<n ; i++)
	{
		printf("%d\n",a[i]);
	}
	for(int i=0 ; i<n ; i+=2)
	{
		b[i/2] = a[i];
	} 
	printf("************\n*********");
	Qsort(b,0,(n-1)/2);
	for(int i=0 ; i<n/2 ; i++)
	{
		printf("%d\n",b[i]);
	}
	return 0;
}

其实这个对于这个而言,如果我们光用上面的调用函数permutation就可以产生10万个随机数,但是这个随机数有一个特点就是如果你给他排序之后你会发现其实他正好是一个1到10万的有序数列,但是我接下来还要研究二分搜索,我总感觉有序的二分搜索不能说明问题,就自我改进了一下。


我理解这个算法为跳坑的问题,首先,a_array为我们储存的想要生成的随机的数组,n/N为我们想要得到随机数组的长度,buffer数组是用来储存所在位置是否已经取了相应的随机数,这样可以实现不重复的原则,srand((unsigned)time(NULL));这行代码是因为rand函数其实是伪随机数,我们需要调用时间函数来重新定义一个种子,这个只需要用一次就可以,它会1秒变换一次,n-i为对于n个想要长度的数组链来讲还剩余没有用过的数的个数,通过随机选取其中的一个数为z,通过j的移动,从前往后找到第j个没有使用过的数,这样就可以实现随机数了。


但是我想实现的是让他们不连着,就通过重新创建一个数组b来跳着接收a,当然这个个数会减少一半,不过都是可以通过控制N来调控的。


void Qsort(int a[], int low, int high)
{
    if(low >= high)
    {
        return;
    }
    int first = low;
    int last = high;
    int key = a[first];/*用字表的第一个记录作为枢轴*/

    while(first < last)
    {
        while(first < last && a[last] >= key)
        {
            --last;
        }

        a[first] = a[last];/*将比第一个小的移到低端*/

        while(first < last && a[first] <= key)
        {
            ++first;
        }

        a[last] = a[first];    
/*将比第一个大的移到高端*/
    }
    a[first] = key;/*枢轴记录到位*/
    Qsort(a, low, first-1);
    Qsort(a, first+1, high);
}

这个就是我们要导入的快速排序算法,也是一个挺简单的算法。这里就不多解释了

#include<iostream>
#include<cstdlib> 
#include<ctime>
using namespace std;
#define max 10

int BinarySearch(int a[],int first,int last,int x)
{
	if(first>last)
	return -1;
	int middle =(first+last)/2;
	if (x<a[middle])
	return BinarySearch(a,first,middle-1,x);
	else if(x==a[middle])
	return middle;
	else
	return BinarySearch(a,middle+1,last,x);
}

int main(){
	srand((unsigned)time(NULL));
	int a1[max] = {0,1,2,3,4,5,6,7,8,9};
	int x = 0;
	int first = 0;
	int last = max-1;
	printf("请输入您想查找得数字");
	scanf("%d",&x);
	int y = BinarySearch(a1,first,last-1,x) + 1;
	if(y == -1)
	{
		printf("抱歉没有找到您要找的数字,请重试");
	}
	else
	{
		printf("找到了所在数字%d的所在位置,在第%d位",x,y);
	}
	return 0;
}
 

这是二分搜索的代码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
测试开发算法题是指在开发过程中,用于测试软件功能和性能的一类算法题目。测试开发人员在编写测试代码时常常需要使用各种算法来实现不同的功能。例如,可以使用算法来生成测试数据、验证软件的正确性、分析测试结果等。 在Java中实现测试开发算法题时,可以使用Java语言提供的各种数据结构和算法库。Java中有丰富的集合类,例如ArrayList、LinkedList、HashSet等,可以方便地存储和操作数据。此外,Java还提供了各种排序和搜索算法,如冒泡排序、快速排序、二分查找等。 在解决测试开发算法题时,可以使用分治法、动态规划、贪心算法等不同的算法思想。例如,如果需要生成一组随机测试数据,可以使用随机数生成器来生成随机数,并将其存储在一个集合中。如果需要验证一个函数的正确性,可以编写一组测试用例,并使用断言语句来验证函数的输出是否符合预期。 测试开发算法题的难度和复杂性各不相同,有些题目可能只需要简单的逻辑判断,而有些题目可能需要较为复杂的数学计算或数据结构操作。因此,测试开发人员需要不断学习和提升自己的算法能力,并灵活运用各种算法来解决问题。 总之,测试开发算法题是测试开发人员在工作中常常遇到的一类问题,通过学习和实践,测试开发人员可以提升自己的算法能力,并更好地完成测试工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值