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

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

#include"Qsort.h" 
#include
#include
#include
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
#include 
#include
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;
}
 

这是二分搜索的代码

你可能感兴趣的:(算法,算法课作业)